[xiph-commits] r14803 - in trunk/oggdsf/website: . cookbook docs local orig pub pub/guiedit pub/skins pub/skins/barthelme pub/skins/barthelme/images pub/skins/pmwiki pub/skins/print scripts uploads uploads/Main uploads/docs uploads/images wiki.d wikilib.d

silvia at svn.xiph.org silvia at svn.xiph.org
Sun Apr 27 17:13:10 PDT 2008


Author: silvia
Date: 2008-04-27 17:13:04 -0700 (Sun, 27 Apr 2008)
New Revision: 14803

Added:
   trunk/oggdsf/website/README.txt
   trunk/oggdsf/website/cookbook/
   trunk/oggdsf/website/cookbook/.htaccess
   trunk/oggdsf/website/docs/
   trunk/oggdsf/website/docs/.htaccess
   trunk/oggdsf/website/docs/COPYING.txt
   trunk/oggdsf/website/docs/DOCUMENTATION.txt
   trunk/oggdsf/website/docs/INSTALL.txt
   trunk/oggdsf/website/docs/UPGRADE.txt
   trunk/oggdsf/website/docs/sample-config.php
   trunk/oggdsf/website/images/
   trunk/oggdsf/website/index.php
   trunk/oggdsf/website/local/
   trunk/oggdsf/website/local/.htaccess
   trunk/oggdsf/website/local/config.php
   trunk/oggdsf/website/orig/
   trunk/oggdsf/website/orig/about_sdk.html
   trunk/oggdsf/website/orig/developers.html
   trunk/oggdsf/website/orig/downloads.html
   trunk/oggdsf/website/orig/enc_theora_graphedit.html
   trunk/oggdsf/website/orig/graphedit.html
   trunk/oggdsf/website/orig/history.html
   trunk/oggdsf/website/pmwiki.php
   trunk/oggdsf/website/pub/
   trunk/oggdsf/website/pub/css/
   trunk/oggdsf/website/pub/guiedit/
   trunk/oggdsf/website/pub/guiedit/README
   trunk/oggdsf/website/pub/guiedit/attach.gif
   trunk/oggdsf/website/pub/guiedit/big.gif
   trunk/oggdsf/website/pub/guiedit/blank.gif
   trunk/oggdsf/website/pub/guiedit/center.gif
   trunk/oggdsf/website/pub/guiedit/em.gif
   trunk/oggdsf/website/pub/guiedit/extlink.gif
   trunk/oggdsf/website/pub/guiedit/guiedit.js
   trunk/oggdsf/website/pub/guiedit/h.gif
   trunk/oggdsf/website/pub/guiedit/h1.gif
   trunk/oggdsf/website/pub/guiedit/h2.gif
   trunk/oggdsf/website/pub/guiedit/h3.gif
   trunk/oggdsf/website/pub/guiedit/hr.gif
   trunk/oggdsf/website/pub/guiedit/indent.gif
   trunk/oggdsf/website/pub/guiedit/left.gif
   trunk/oggdsf/website/pub/guiedit/math.gif
   trunk/oggdsf/website/pub/guiedit/ol.gif
   trunk/oggdsf/website/pub/guiedit/outdent.gif
   trunk/oggdsf/website/pub/guiedit/pagelink.gif
   trunk/oggdsf/website/pub/guiedit/preview.gif
   trunk/oggdsf/website/pub/guiedit/right.gif
   trunk/oggdsf/website/pub/guiedit/save.gif
   trunk/oggdsf/website/pub/guiedit/small.gif
   trunk/oggdsf/website/pub/guiedit/spellcheck.gif
   trunk/oggdsf/website/pub/guiedit/strong.gif
   trunk/oggdsf/website/pub/guiedit/sub.gif
   trunk/oggdsf/website/pub/guiedit/sup.gif
   trunk/oggdsf/website/pub/guiedit/table.gif
   trunk/oggdsf/website/pub/guiedit/ul.gif
   trunk/oggdsf/website/pub/guiedit/underline.gif
   trunk/oggdsf/website/pub/skins/
   trunk/oggdsf/website/pub/skins/barthelme/
   trunk/oggdsf/website/pub/skins/barthelme/barthelme.css
   trunk/oggdsf/website/pub/skins/barthelme/barthelme.php
   trunk/oggdsf/website/pub/skins/barthelme/barthelme.tmpl
   trunk/oggdsf/website/pub/skins/barthelme/images/
   trunk/oggdsf/website/pub/skins/barthelme/images/bk.png
   trunk/oggdsf/website/pub/skins/barthelme/images/feed.png
   trunk/oggdsf/website/pub/skins/barthelme/images/header.png
   trunk/oggdsf/website/pub/skins/pmwiki/
   trunk/oggdsf/website/pub/skins/pmwiki/README
   trunk/oggdsf/website/pub/skins/pmwiki/pmwiki-32.gif
   trunk/oggdsf/website/pub/skins/pmwiki/pmwiki.css
   trunk/oggdsf/website/pub/skins/pmwiki/pmwiki.tmpl
   trunk/oggdsf/website/pub/skins/print/
   trunk/oggdsf/website/pub/skins/print/README
   trunk/oggdsf/website/pub/skins/print/print.css
   trunk/oggdsf/website/pub/skins/print/print.php
   trunk/oggdsf/website/pub/skins/print/print.tmpl
   trunk/oggdsf/website/scripts/
   trunk/oggdsf/website/scripts/.htaccess
   trunk/oggdsf/website/scripts/author.php
   trunk/oggdsf/website/scripts/authuser.php
   trunk/oggdsf/website/scripts/blocklist.php
   trunk/oggdsf/website/scripts/caches.php
   trunk/oggdsf/website/scripts/creole.php
   trunk/oggdsf/website/scripts/crypt.php
   trunk/oggdsf/website/scripts/diag.php
   trunk/oggdsf/website/scripts/draft.php
   trunk/oggdsf/website/scripts/feeds.php
   trunk/oggdsf/website/scripts/forms.php
   trunk/oggdsf/website/scripts/guiedit.php
   trunk/oggdsf/website/scripts/httpauth.php
   trunk/oggdsf/website/scripts/intermap.txt
   trunk/oggdsf/website/scripts/markupexpr.php
   trunk/oggdsf/website/scripts/notify.php
   trunk/oggdsf/website/scripts/pagelist.php
   trunk/oggdsf/website/scripts/pagerev.php
   trunk/oggdsf/website/scripts/pgcust.php
   trunk/oggdsf/website/scripts/phpdiff.php
   trunk/oggdsf/website/scripts/prefs.php
   trunk/oggdsf/website/scripts/refcount.php
   trunk/oggdsf/website/scripts/robots.php
   trunk/oggdsf/website/scripts/simuledit.php
   trunk/oggdsf/website/scripts/skins.php
   trunk/oggdsf/website/scripts/stdconfig.php
   trunk/oggdsf/website/scripts/stdmarkup.php
   trunk/oggdsf/website/scripts/trails.php
   trunk/oggdsf/website/scripts/transition.php
   trunk/oggdsf/website/scripts/upgrades.php
   trunk/oggdsf/website/scripts/upload.php
   trunk/oggdsf/website/scripts/urlapprove.php
   trunk/oggdsf/website/scripts/vardoc.php
   trunk/oggdsf/website/scripts/version.php
   trunk/oggdsf/website/scripts/wikistyles.php
   trunk/oggdsf/website/scripts/wikiwords.php
   trunk/oggdsf/website/scripts/xlpage-utf-8.php
   trunk/oggdsf/website/uploads/
   trunk/oggdsf/website/uploads/Main/
   trunk/oggdsf/website/uploads/Main/oggcodecs_0.69.8924.exe
   trunk/oggdsf/website/uploads/Main/oggcodecs_0.70.0827.exe
   trunk/oggdsf/website/uploads/Main/oggcodecs_0.71.0946.exe
   trunk/oggdsf/website/uploads/Main/oggcodecs_0.72.1838.exe
   trunk/oggdsf/website/uploads/Main/oggcodecs_0.73.1936.exe
   trunk/oggdsf/website/uploads/Main/oggcodecs_SSE2_0.68.8333.zip
   trunk/oggdsf/website/uploads/Main/oggcodecs_SSE_0.68.8333.zip
   trunk/oggdsf/website/uploads/Main/oggcodecs_src_0.70.0827.zip
   trunk/oggdsf/website/uploads/docs/
   trunk/oggdsf/website/uploads/docs/index.html
   trunk/oggdsf/website/uploads/images/
   trunk/oggdsf/website/uploads/images/connect_encoders.JPG
   trunk/oggdsf/website/uploads/images/divx+vorbis_decode.JPG
   trunk/oggdsf/website/uploads/images/encoders_added.JPG
   trunk/oggdsf/website/uploads/images/ensure_YV12.JPG
   trunk/oggdsf/website/uploads/images/filter_properties.JPG
   trunk/oggdsf/website/uploads/images/find_encoders.JPG
   trunk/oggdsf/website/uploads/images/fully_connected.JPG
   trunk/oggdsf/website/uploads/images/mixmux.JPG
   trunk/oggdsf/website/uploads/images/mp3_to_speex_graphedit.JPG
   trunk/oggdsf/website/uploads/images/mp3_to_vorbis_graphedit.JPG
   trunk/oggdsf/website/uploads/images/ogg_split_graphedit.JPG
   trunk/oggdsf/website/uploads/images/pin_properties.JPG
   trunk/oggdsf/website/uploads/images/press_play.JPG
   trunk/oggdsf/website/uploads/images/remove_renderers.JPG
   trunk/oggdsf/website/uploads/images/select_encoders.JPG
   trunk/oggdsf/website/uploads/images/select_muxer.JPG
   trunk/oggdsf/website/uploads/images/select_output_file.JPG
   trunk/oggdsf/website/uploads/images/select_render_file.JPG
   trunk/oggdsf/website/uploads/images/show_rendered_graph.JPG
   trunk/oggdsf/website/uploads/images/theora_properties.JPG
   trunk/oggdsf/website/uploads/images/vorbis_to_mp3_graphedit.JPG
   trunk/oggdsf/website/uploads/images/wave_to_vorbis_graphedit.JPG
   trunk/oggdsf/website/uploads/images/wma_to_vorbis_graphedit.JPG
   trunk/oggdsf/website/wiki.d/
   trunk/oggdsf/website/wiki.d/.flock
   trunk/oggdsf/website/wiki.d/.htaccess
   trunk/oggdsf/website/wiki.d/.lastmod
   trunk/oggdsf/website/wiki.d/.pageindex
   trunk/oggdsf/website/wiki.d/Main.About
   trunk/oggdsf/website/wiki.d/Main.DeveloperInfo
   trunk/oggdsf/website/wiki.d/Main.Downloads
   trunk/oggdsf/website/wiki.d/Main.EncTheoraGraphedit
   trunk/oggdsf/website/wiki.d/Main.Graphedit
   trunk/oggdsf/website/wiki.d/Main.History
   trunk/oggdsf/website/wiki.d/Main.HomePage
   trunk/oggdsf/website/wiki.d/Main.RecentChanges
   trunk/oggdsf/website/wiki.d/Main.SseBuilds
   trunk/oggdsf/website/wiki.d/Site.AllRecentChanges
   trunk/oggdsf/website/wiki.d/Site.RecentChanges
   trunk/oggdsf/website/wiki.d/Site.SideBar
   trunk/oggdsf/website/wiki.d/SiteAdmin.Status
   trunk/oggdsf/website/wikilib.d/
   trunk/oggdsf/website/wikilib.d/Main.HomePage
   trunk/oggdsf/website/wikilib.d/Main.WikiSandbox
   trunk/oggdsf/website/wikilib.d/PmWiki.AccessKeys
   trunk/oggdsf/website/wikilib.d/PmWiki.Audiences
   trunk/oggdsf/website/wikilib.d/PmWiki.AuthUser
   trunk/oggdsf/website/wikilib.d/PmWiki.AvailableActions
   trunk/oggdsf/website/wikilib.d/PmWiki.BackupAndRestore
   trunk/oggdsf/website/wikilib.d/PmWiki.BasicEditing
   trunk/oggdsf/website/wikilib.d/PmWiki.BasicVariables
   trunk/oggdsf/website/wikilib.d/PmWiki.Blocklist
   trunk/oggdsf/website/wikilib.d/PmWiki.Categories
   trunk/oggdsf/website/wikilib.d/PmWiki.ChangeLog
   trunk/oggdsf/website/wikilib.d/PmWiki.ConditionalMarkup
   trunk/oggdsf/website/wikilib.d/PmWiki.Contributors
   trunk/oggdsf/website/wikilib.d/PmWiki.CreatingNewPages
   trunk/oggdsf/website/wikilib.d/PmWiki.CustomInterMap
   trunk/oggdsf/website/wikilib.d/PmWiki.CustomMarkup
   trunk/oggdsf/website/wikilib.d/PmWiki.CustomWikiStyles
   trunk/oggdsf/website/wikilib.d/PmWiki.DebugVariables
   trunk/oggdsf/website/wikilib.d/PmWiki.DeletingPages
   trunk/oggdsf/website/wikilib.d/PmWiki.DesignNotes
   trunk/oggdsf/website/wikilib.d/PmWiki.DocumentationIndex
   trunk/oggdsf/website/wikilib.d/PmWiki.EditVariables
   trunk/oggdsf/website/wikilib.d/PmWiki.FAQ
   trunk/oggdsf/website/wikilib.d/PmWiki.FilePermissions
   trunk/oggdsf/website/wikilib.d/PmWiki.FmtPageName
   trunk/oggdsf/website/wikilib.d/PmWiki.Functions
   trunk/oggdsf/website/wikilib.d/PmWiki.Glossary
   trunk/oggdsf/website/wikilib.d/PmWiki.GroupHeader
   trunk/oggdsf/website/wikilib.d/PmWiki.GroupHeaders
   trunk/oggdsf/website/wikilib.d/PmWiki.I18nVariables
   trunk/oggdsf/website/wikilib.d/PmWiki.Images
   trunk/oggdsf/website/wikilib.d/PmWiki.IncludeOtherPages
   trunk/oggdsf/website/wikilib.d/PmWiki.InitialSetupTasks
   trunk/oggdsf/website/wikilib.d/PmWiki.Installation
   trunk/oggdsf/website/wikilib.d/PmWiki.InterMap
   trunk/oggdsf/website/wikilib.d/PmWiki.Internationalizations
   trunk/oggdsf/website/wikilib.d/PmWiki.LayoutVariables
   trunk/oggdsf/website/wikilib.d/PmWiki.LinkVariables
   trunk/oggdsf/website/wikilib.d/PmWiki.Links
   trunk/oggdsf/website/wikilib.d/PmWiki.LocalCustomizations
   trunk/oggdsf/website/wikilib.d/PmWiki.MailPosts
   trunk/oggdsf/website/wikilib.d/PmWiki.MailingLists
   trunk/oggdsf/website/wikilib.d/PmWiki.MarkupExpressions
   trunk/oggdsf/website/wikilib.d/PmWiki.MarkupMasterIndex
   trunk/oggdsf/website/wikilib.d/PmWiki.Notify
   trunk/oggdsf/website/wikilib.d/PmWiki.OtherVariables
   trunk/oggdsf/website/wikilib.d/PmWiki.PageDirectives
   trunk/oggdsf/website/wikilib.d/PmWiki.PageFileFormat
   trunk/oggdsf/website/wikilib.d/PmWiki.PageHistory
   trunk/oggdsf/website/wikilib.d/PmWiki.PageLists
   trunk/oggdsf/website/wikilib.d/PmWiki.PageVariables
   trunk/oggdsf/website/wikilib.d/PmWiki.PagelistVariables
   trunk/oggdsf/website/wikilib.d/PmWiki.Passwords
   trunk/oggdsf/website/wikilib.d/PmWiki.PasswordsAdmin
   trunk/oggdsf/website/wikilib.d/PmWiki.PathVariables
   trunk/oggdsf/website/wikilib.d/PmWiki.PatrickMichaud
   trunk/oggdsf/website/wikilib.d/PmWiki.PerGroupCustomizations
   trunk/oggdsf/website/wikilib.d/PmWiki.PmWiki
   trunk/oggdsf/website/wikilib.d/PmWiki.PmWikiPhilosophy
   trunk/oggdsf/website/wikilib.d/PmWiki.RefCount
   trunk/oggdsf/website/wikilib.d/PmWiki.ReleaseNotes
   trunk/oggdsf/website/wikilib.d/PmWiki.Requirements
   trunk/oggdsf/website/wikilib.d/PmWiki.Security
   trunk/oggdsf/website/wikilib.d/PmWiki.SecurityVariables
   trunk/oggdsf/website/wikilib.d/PmWiki.SimultaneousEdits
   trunk/oggdsf/website/wikilib.d/PmWiki.SitePreferences
   trunk/oggdsf/website/wikilib.d/PmWiki.SkinTemplates
   trunk/oggdsf/website/wikilib.d/PmWiki.Skins
   trunk/oggdsf/website/wikilib.d/PmWiki.SpecialCharacters
   trunk/oggdsf/website/wikilib.d/PmWiki.TableDirectives
   trunk/oggdsf/website/wikilib.d/PmWiki.Tables
   trunk/oggdsf/website/wikilib.d/PmWiki.TextFormattingRules
   trunk/oggdsf/website/wikilib.d/PmWiki.Troubleshooting
   trunk/oggdsf/website/wikilib.d/PmWiki.Upgrades
   trunk/oggdsf/website/wikilib.d/PmWiki.UpgradingFromPmWiki1
   trunk/oggdsf/website/wikilib.d/PmWiki.UploadVariables
   trunk/oggdsf/website/wikilib.d/PmWiki.Uploads
   trunk/oggdsf/website/wikilib.d/PmWiki.UploadsAdmin
   trunk/oggdsf/website/wikilib.d/PmWiki.UrlApprovals
   trunk/oggdsf/website/wikilib.d/PmWiki.Variables
   trunk/oggdsf/website/wikilib.d/PmWiki.WebFeeds
   trunk/oggdsf/website/wikilib.d/PmWiki.WikiAdministrator
   trunk/oggdsf/website/wikilib.d/PmWiki.WikiFarmTerminology
   trunk/oggdsf/website/wikilib.d/PmWiki.WikiFarms
   trunk/oggdsf/website/wikilib.d/PmWiki.WikiGroup
   trunk/oggdsf/website/wikilib.d/PmWiki.WikiGroups
   trunk/oggdsf/website/wikilib.d/PmWiki.WikiPage
   trunk/oggdsf/website/wikilib.d/PmWiki.WikiSandbox
   trunk/oggdsf/website/wikilib.d/PmWiki.WikiStructure
   trunk/oggdsf/website/wikilib.d/PmWiki.WikiStyleExamples
   trunk/oggdsf/website/wikilib.d/PmWiki.WikiStyles
   trunk/oggdsf/website/wikilib.d/PmWiki.WikiTrails
   trunk/oggdsf/website/wikilib.d/PmWiki.WikiWikiWeb
   trunk/oggdsf/website/wikilib.d/PmWiki.WikiWord
   trunk/oggdsf/website/wikilib.d/PmWiki.WikiWords
   trunk/oggdsf/website/wikilib.d/Site.AuthForm
   trunk/oggdsf/website/wikilib.d/Site.AuthUser
   trunk/oggdsf/website/wikilib.d/Site.EditForm
   trunk/oggdsf/website/wikilib.d/Site.EditQuickReference
   trunk/oggdsf/website/wikilib.d/Site.GroupAttributes
   trunk/oggdsf/website/wikilib.d/Site.PageActions
   trunk/oggdsf/website/wikilib.d/Site.PageListTemplates
   trunk/oggdsf/website/wikilib.d/Site.PageNotFound
   trunk/oggdsf/website/wikilib.d/Site.Preferences
   trunk/oggdsf/website/wikilib.d/Site.Search
   trunk/oggdsf/website/wikilib.d/Site.SideBar
   trunk/oggdsf/website/wikilib.d/Site.Site
   trunk/oggdsf/website/wikilib.d/Site.UploadQuickReference
   trunk/oggdsf/website/wikilib.d/SiteAdmin.AuthList
   trunk/oggdsf/website/wikilib.d/SiteAdmin.AuthUser
   trunk/oggdsf/website/wikilib.d/SiteAdmin.GroupAttributes
   trunk/oggdsf/website/wikilib.d/SiteAdmin.Status
Removed:
   trunk/oggdsf/website/about_sdk.html
   trunk/oggdsf/website/developers.html
   trunk/oggdsf/website/downloads.html
   trunk/oggdsf/website/enc_theora_graphedit.html
   trunk/oggdsf/website/graphedit.html
   trunk/oggdsf/website/history.html
   trunk/oggdsf/website/images/
   trunk/oggdsf/website/index.html
   trunk/oggdsf/website/sse_builds.html
   trunk/oggdsf/website/version_check.php
Log:
building a new version of the oggdsf website

Added: trunk/oggdsf/website/README.txt
===================================================================
--- trunk/oggdsf/website/README.txt	                        (rev 0)
+++ trunk/oggdsf/website/README.txt	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,48 @@
+This is the README.txt file for PmWiki, a wiki-based system for
+collaborative creation and maintenance of websites.
+
+PmWiki is distributed with the following directories:
+
+  docs/           Brief documentation, sample configuration scripts
+  local/          Configuration scripts
+  cookbook/       Recipes (add-ons) from the PmWiki Cookbook
+  pub/skins/      Layout templates ("skins" for custom look and feel)
+  pub/css/        Extra CSS stylesheet files
+  pub/guiedit/    Files for the Edit Form's GUIEdit module
+  scripts/        Scripts that are part of PmWiki
+  wikilib.d/      Bundled wiki pages, including
+                    * a default Home Page
+                    * PmWiki documentation pages
+                    * some Site-oriented pages
+
+After PmWiki is installed the following directories may also exist:
+
+  wiki.d/         Wiki pages
+  uploads/        Uploaded files (page attachments)
+
+For quick installation advice, see docs/INSTALL.txt.
+
+For more extensive information about installing PmWiki, visit
+  http://pmwiki.org/wiki/PmWiki/Installation
+
+For information about running PmWiki in standalone mode without
+requiring a webserver, visit
+  http://pmwiki.org/wiki/Cookbook/Standalone
+
+PmWiki is Copyright 2001-2006 Patrick R. Michaud
+pmichaud at pobox.com
+http://www.pmichaud.com/
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+The GNU General Public License is distributed with this program
+(see docs/COPYING.txt) and it is also available online at
+http://www.fsf.org/licensing/licenses/gpl.txt .

Deleted: trunk/oggdsf/website/about_sdk.html
===================================================================
--- trunk/oggdsf/website/about_sdk.html	2008-04-26 10:03:23 UTC (rev 14802)
+++ trunk/oggdsf/website/about_sdk.html	2008-04-28 00:13:04 UTC (rev 14803)
@@ -1,275 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-  <title>illiminable Ogg Directshow Filters for Speex, Vorbis, Theora and FLAC</title>
-  <meta name="description" content="Directshow Ogg demuxer/muxer with vorbis, speex, FLAC and theora decoders and encoders.">
-  <meta name="keywords" content="directshow, theora, vorbis, speex, ogg, media player, flac, codec, windows, audio, video, wmp, directX, plugin, plug-in, decoder, encoder, demux, mux, demuxer">
-</head>
-<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#DD0000" alink="#FF0000">
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#DDDDDD" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.xiph.org">Xiph.org</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.vorbis.com">Vorbis</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.speex.org">Speex</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.theora.org">Theora</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://flac.sourceforge.net/">FLAC</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.annodex.net">Annodex</a></DIV>
-</FONT>
-</TD>
-
-<TD width=10%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>ogg at illiminable.com</b></DIV>
-</FONT>
-</TD>
-
-</TR>
-
-
-</TABLE>
-</DIV>
-</FONT>
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><b><font size="+2">About Ogg SDK and oggcodecs Project</font></b></DIV>
-</FONT>
-</TD>
-</TR>
-
-</TABLE>
-</DIV>
-</FONT>
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#070707" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-
-
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.illiminable.com/ogg/">Home</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV></DIV>
-</FONT>
-</TD>
-
-<TD width=10%><FONT size=2 color="#000000" face="Arial">
-<DIV></DIV>
-</FONT>
-</TD>
-
-
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/developers.html">Developer Info</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/history.html">History</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/docs/index.html">Documentation</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/about_sdk.html">About</a></DIV>
-</FONT>
-</TD>
-
-</TR>
-
-
-</TABLE>
-</DIV>
-</FONT>
-
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#070707" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-
-
-
-
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Goals</b></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-The aim of this project is to provide the most complete implementation of the <a href="http://www.xiph.org/">xiph.org</a> codecs for Windows and Directshow. This includes decoders and encoders for all the xiph.org formats as well as <a href="http://www.annodex.net">annodex</a>. It is released under a BSD license, so they can be used by both open-source and commercial applications.
-
-<br>
-<br>
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Current State</b></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-Besides the directshow filters which many people are familiar with. The source distribution also contains many useful tools, for debugging and validating ogg files, which build on multiple platforms. There is also a .NET media player class which can basically provide an "instant" media player in any .NET application, as well as an early implementation of an apache2 module which can provide server side seeking (currently only of annodex files, but soon also ogg files)
-<br>
-<br>
-More information about the libraries and tools that are available in the source distribution can be found in the <a href="http://www.illiminable.com/ogg/developers.html">developers section</a>
-<br>
-<br>
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>In the pipeline</b></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-Many things are planned, I'm not committing solidly to anything! Though as at February 2006, you can expect to see a lot more development over the next few months, and hopefully for the rest of this year. We might get to 1.0 one of these years, with the goal being for the most complete, stable and user friendly solution for Xiph codecs on Windows.
-<br>
-<br>
-I was really busy last year and didn't get to do much, hopefully 2006 will see a much shorter release cycle.
-<br>
-<br>
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Contact me</b></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-<br>
-If you have questions, bug reports, feedback, suggestions, or want to tell me about your projects using oggcodecs you can contact me via email at ogg at illiminable.com . I try to answer all email, if you email me and I don't respond within 7 days I am not ignoring you, your email probably got lost amongst all the spam, or I've gone on holidays! In either case, if I don't respond, email me again. Please make your subjects meaningful, so they are easy to spot amongst the spam. Don't attach files to your first email to me, that increases the chance it will be marked as spam. If you have something you want to send me, tell me in your first email, and then once I respond I will tell you how to get the file to me, or I'll be expecting an attachment from you.
-<br>
-<br>
-You can also usually find me on IRC on Freenode servers (www.freenode.net) in #vorbis, #theora or #annodex. Remember I'm in Australia (GMT+8) so I'm more likely to respond in the afternoon/evening my time. My nick is illi.<br>
-<br>
-You could also try the xiph.org mailing lists, such as vorbis-dev.<br><br>
-Or if you want to see the svn commit information on the web, you can spy on me here with <a href="http://cia.navi.cx/stats/author/illiminable">CIA</a><br><br>
-
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#070707" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-</body>
-</html>
-

Added: trunk/oggdsf/website/cookbook/.htaccess
===================================================================
--- trunk/oggdsf/website/cookbook/.htaccess	                        (rev 0)
+++ trunk/oggdsf/website/cookbook/.htaccess	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,12 @@
+# This file is cookbook/.htaccess -- the default distribution contains this
+# file to prevent cookbook/ scripts from being accessed directly by browsers
+# (this is a potential, albeit very unlikely, security hole).
+#
+# If you alter or replace this file, it will likely be overwritten when
+# you upgrade from one version of PmWiki to another.  Be sure to save
+# a copy of your alterations in another location so you can restore them,
+# and you might try changing this file to be read-only to prevent a PmWiki
+# upgrade from overwriting your altered version.
+
+Order Deny,Allow
+Deny from all

Deleted: trunk/oggdsf/website/developers.html
===================================================================
--- trunk/oggdsf/website/developers.html	2008-04-26 10:03:23 UTC (rev 14802)
+++ trunk/oggdsf/website/developers.html	2008-04-28 00:13:04 UTC (rev 14803)
@@ -1,289 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-  <title>illiminable Ogg Directshow Filters for Speex, Vorbis, Theora and FLAC</title>
-  <meta name="description" content="Directshow Ogg demuxer/muxer with vorbis, speex, FLAC and theora decoders and encoders.">
-  <meta name="keywords" content="directshow, theora, vorbis, speex, ogg, media player, flac, codec, windows, audio, video, wmp, directX, plugin, plug-in, decoder, encoder, demux, mux, demuxer">
-</head>
-<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#DD0000" alink="#FF0000">
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#DDDDDD" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.xiph.org">Xiph.org</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.vorbis.com">Vorbis</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.speex.org">Speex</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.theora.org">Theora</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://flac.sourceforge.net/">FLAC</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.annodex.net">Annodex</a></DIV>
-</FONT>
-</TD>
-
-<TD width=10%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>ogg at illiminable.com</b></DIV>
-</FONT>
-</TD>
-
-</TR>
-
-
-</TABLE>
-</DIV>
-</FONT>
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><b><font size="+2">Developer information for Ogg SDK</font></b></DIV>
-</FONT>
-</TD>
-</TR>
-
-</TABLE>
-</DIV>
-</FONT>
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#070707" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-
-
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.illiminable.com/ogg/">Home</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV></DIV>
-</FONT>
-</TD>
-
-<TD width=10%><FONT size=2 color="#000000" face="Arial">
-<DIV></DIV>
-</FONT>
-</TD>
-
-
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/developers.html">Developer Info</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/history.html">History</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/docs/index.html">Documentation</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/about_sdk.html">About SDK</a></DIV>
-</FONT>
-</TD>
-
-</TR>
-
-
-</TABLE>
-</DIV>
-</FONT>
-
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#070707" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-
-
-
-
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Useful libraries in the SDK</b></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-<br>
-<br>
-
-With the exception of the .NET libraries, all those below will build on Windows, Mac OSX and Unix.
-
-<br>
-<b><FONT size=3 color="#000000" face="Arial">libOOOgg</FONT></b><br>
-libOOOgg is an independant implementation of the ogg encapsulation format. It provides a C++/OO set of classes for manipulating ogg pages and packets, and to paginator and packetise ogg files or streams. It provides similar functionality to libogg.
-<br>
-<br>
-
-<b><FONT size=3 color="#000000" face="Arial">libOOOggSeek</FONT></b><br>
-libOOOggSeek provides seektable based routines for seeking in ogg or annodex files, for rapid and efficient seeking as well as caching seektables for high performance low latency uses
-<br>
-<br>
-
-<b><FONT size=3 color="#000000" face="Arial">libTemporalURI</FONT></b><br>
-libTemporalURI provides parsing functions for the <a href="http://www.annodex.net/TR/draft-pfeiffer-temporal-fragments-02.html">temporal URI specification</a> which allows you to query media resources from a server by time offset in a URI. Also a .NET port of this library exists as libTemporalURIDotNET
-<br>
-<br>
-
-<b><FONT size=3 color="#000000" face="Arial">libDSPlayDotNET</FONT></b><br>
-libDSPlay is a library which provides media player functionality to .NET applications. It abstracts away all the directshow underpinnings and offers a simple API to control the media, which can be easily called from any .NET application. It provides all the most common media player functionality such as play, pause, stop, seek, volume, balance and even grabbing images from a playing video.
-<br>
-<br>
-
-<b><FONT size=3 color="#000000" face="Arial">libOggChef</FONT></b><br>
-libOggChef is a helper library for dynamically recomposing ogg and annodex files. It is still in early development. This is the core of the work done by the apache module (see below)
-<br>
-<br>
-
-<b><FONT size=3 color="#000000" face="Arial">mod_oggchef</FONT></b><br>
-mod_oggchef is an apache 2 module, which provides server side seeking via temporal URI's for ogg and annodex files. It is still in early development
-<br>
-<br>
-
-<b><FONT size=3 color="#000000" face="Arial">libCMMLTags</FONT></b><br>
-libCMMLTags is a container class library for manipulating <a href="http://www.annodex.net/TR/draft-pfeiffer-cmml-01.html">CMML V2.0</a> documents and elements. It is also available in a .NET library as libCMMLTagsDotNET
-<br>
-<br>
-
-<b><FONT size=3 color="#000000" face="Arial">libCMMLParse</FONT></b><br>
-libCMMLParse is a parsing library for CMML V2.0 It parses xml and generates the objects found in libCMMLTags. This is also available in a .NET version as libCMMLParseDotNET
-<br>
-<br>
-
-
-<b><FONT size=3 color="#000000" face="Arial">libDirectshowAbstracts</FONT></b><br>
-libDirectshowAbstracts provides several useful classes for creating directshow filters. All the directshow filters in oggcodecs use these.
-<br>
-<br>
-
-<b><FONT size=3 color="#000000" face="Arial">libVorbisComment</FONT></b><br>
-libVorbisComment is a parsing library for parsing and manipulating vorbis comment strings. It is also available as a .NET library as libVorbisCommentDotNet
-<br>
-<br>
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Useful tools in the SDK</b></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-<b><FONT size=3 color="#000000" face="Arial">OOOggDump</FONT></b><br>
-OOOggDump provides hex dumps of ogg files showing header data and packet sizes and breaks. It is useful for debugging problems that can occur in ogg files.
-<br>
-<br>
-
-<b><FONT size=3 color="#000000" face="Arial">OOOggValidate</FONT></b><br>
-OOOggValidate validates an ogg file structurally.
-<br>
-<br>
-
-
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#070707" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-</body>
-</html>
-

Added: trunk/oggdsf/website/docs/.htaccess
===================================================================
--- trunk/oggdsf/website/docs/.htaccess	                        (rev 0)
+++ trunk/oggdsf/website/docs/.htaccess	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1 @@
+AddType text/plain .php

Added: trunk/oggdsf/website/docs/COPYING.txt
===================================================================
--- trunk/oggdsf/website/docs/COPYING.txt	                        (rev 0)
+++ trunk/oggdsf/website/docs/COPYING.txt	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.

Added: trunk/oggdsf/website/docs/DOCUMENTATION.txt
===================================================================
--- trunk/oggdsf/website/docs/DOCUMENTATION.txt	                        (rev 0)
+++ trunk/oggdsf/website/docs/DOCUMENTATION.txt	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,10 @@
+Where is the documentation?
+
+PmWiki maintains its documentation as wiki pages.
+If you already have PmWiki installed, then a local copy of
+the documentation is available through PmWiki itself --
+see the "PmWiki.DocumentationIndex" page on your site.
+
+The documentation is also available online at
+http://www.pmwiki.org/wiki/PmWiki/DocumentationIndex .
+

Added: trunk/oggdsf/website/docs/INSTALL.txt
===================================================================
--- trunk/oggdsf/website/docs/INSTALL.txt	                        (rev 0)
+++ trunk/oggdsf/website/docs/INSTALL.txt	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,39 @@
+This is the INSTALL.txt file for PmWiki.  This document provides
+convenient steps so an administrator can have a PmWiki site up and
+running quickly.  More extensive information about installing PmWiki
+is available at http://www.pmwiki.org/wiki/PmWiki/Installation .
+
+Once your site is up and running you will be able to read the bundled
+documentation pages.
+
+Here are some quick steps to start you on your path toward a complete,
+customized installation:
+
+1a) Put the software in a location accessible by your webserver.
+
+1b) PmWiki can also be run if no webserver is installed.  See
+    http://pmwiki.org/wiki/Cookbook/Standalone
+
+2) Point your browser to pmwiki.php.
+
+3) You may see an error message saying that PmWiki needs to have
+   a writable wiki.d/ directory.  If so, follow the directions to
+   establish one.  This directory will hold your wiki page files.
+
+4) If you want a directory index file, create a file called index.php
+   in the main directory that contains the following single line of
+   text, purposefully without a closing "?>":
+
+<?php include('pmwiki.php');
+
+5) Sitewide configuration settings will go in a "local configuration
+   file" named local/config.php.  Copy the well-commented sample
+   configuration file from docs/sample-config.php to the local/
+   subdirectory, then rename the copy to config.php.  Edit your
+   new local/config.php file to suit your preferences.
+
+That's it.  Next you'll probably want to browse your new site and
+read the bundled documentation.  A good place to start is the
+PmWiki.InitialSetupTasks page.
+
+Enjoy!

Added: trunk/oggdsf/website/docs/UPGRADE.txt
===================================================================
--- trunk/oggdsf/website/docs/UPGRADE.txt	                        (rev 0)
+++ trunk/oggdsf/website/docs/UPGRADE.txt	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,50 @@
+This UPGRADE.txt file is a command-line syntax reminder for
+experienced PmWiki administrators.  For full documentation on
+upgrading Pmwiki, see the bundled PmWiki.Upgrades page or visit
+
+  http://www.pmwiki.org/wiki/PmWiki/Upgrades
+
+See also these related pages:
+
+  http://www.pmwiki.org/wiki/PmWiki/BackupAndRestore
+  http://www.pmwiki.org/wiki/PmWiki/Subversion
+
+The examples assume your PmWiki site is in a ./pmwiki/
+directory (a directory named "pmwiki" immediately below the
+working directory).
+
+Backing up (always a good idea!):
+
+  tar -zcvf ~/pmwiki-backup.tar.gz pmwiki
+  zip -9r  ~/pmwiki-backup.zip pmwiki
+
+Or, to keep backups organized by date:
+
+  tar -zcvf ~/pmwiki-site-`date +%Y%m%d%M`.tar.gz pmwiki
+  zip -9r  ~/pmwiki-site-`date +%Y%m%d%M`.zip pmwiki
+
+The latest release is available here:
+
+  http://www.pmichaud.com/pub/pmwiki/pmwiki-latest.tgz
+  http://www.pmichaud.com/pub/pmwiki/pmwiki-latest.zip
+
+Example download commands:
+
+  wget http://www.pmichaud.com/pub/pmwiki/pmwiki-latest.tgz
+  lftpget http://www.pmichaud.com/pub/pmwiki/pmwiki-latest.tgz
+  links http://www.pmichaud.com/pub/pmwiki/pmwiki-latest.tgz
+  lynx http://www.pmichaud.com/pub/pmwiki/pmwiki-latest.tgz
+
+Expanding the archive:
+
+  tar -zxvf pmwiki-latest.tgz  # for the gzipped tarball
+  unzip pmwiki-latest.zip      # for the .zip archive
+
+Copying the files (two ways to do it):
+
+  cp -av pmwiki-2.1.x/. pmwiki
+  cp -Rpv pmwiki-2.1.x/. pmwiki
+
+Subversion upgrade:
+
+  svn export svn://pmwiki.org/pmwiki/tags/latest pmwiki --force

Added: trunk/oggdsf/website/docs/sample-config.php
===================================================================
--- trunk/oggdsf/website/docs/sample-config.php	                        (rev 0)
+++ trunk/oggdsf/website/docs/sample-config.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,159 @@
+<?php if (!defined('PmWiki')) exit();
+##  This is a sample config.php file.  To use this file, copy it to
+##  local/config.php, then edit it for whatever customizations you want.
+##  Also, be sure to take a look at http://www.pmichaud.com/wiki/Cookbook
+##  for more details on the types of customizations that can be added
+##  to PmWiki.  
+
+##  $WikiTitle is the name that appears in the browser's title bar.
+$WikiTitle = 'PmWiki';
+
+##  $ScriptUrl is your preferred URL for accessing wiki pages
+##  $PubDirUrl is the URL for the pub directory.
+# $ScriptUrl = 'http://www.mydomain.com/path/to/pmwiki.php';
+# $PubDirUrl = 'http://www.mydomain.com/path/to/pub';
+
+##  If you want to use URLs of the form .../pmwiki.php/Group/PageName
+##  instead of .../pmwiki.php?p=Group.PageName, try setting
+##  $EnablePathInfo below.  Note that this doesn't work in all environments,
+##  it depends on your webserver and PHP configuration.  You might also 
+##  want to check http://www.pmwiki.org/wiki/Cookbook/CleanUrls more
+##  details about this setting and other ways to create nicer-looking urls.
+# $EnablePathInfo = 1;
+
+## $PageLogoUrl is the URL for a logo image -- you can change this
+## to your own logo if you wish.
+# $PageLogoUrl = "$PubDirUrl/skins/pmwiki/pmwiki-32.gif";
+
+## If you want to have a custom skin, then set $Skin to the name
+## of the directory (in pub/skins/) that contains your skin files.
+## See PmWiki.Skins and Cookbook.Skins.
+# $Skin = 'pmwiki';
+
+## You'll probably want to set an administrative password that you
+## can use to get into password-protected pages.  Also, by default 
+## the "attr" passwords for the PmWiki and Main groups are locked, so
+## an admin password is a good way to unlock those.  See PmWiki.Passwords
+## and PmWiki.PasswordsAdmin.
+# $DefaultPasswords['admin'] = crypt('secret');
+
+## If you're running a publicly available site and allow anyone to
+## edit without requiring a password, you probably want to put some
+## blocklists in place to avoid wikispam.  See PmWiki.Blocklist.
+# $EnableBlocklist = 1;                    # enable manual blocklists
+# $EnableBlocklist = 10;                   # enable automatic blocklists
+
+##  PmWiki comes with graphical user interface buttons for editing;
+##  to enable these buttons, set $EnableGUIButtons to 1.  
+# $EnableGUIButtons = 1;
+
+##  To enable markup syntax from the Creole common wiki markup language
+##  (http://www.wikicreole.org/), include it here:
+# include_once('scripts/creole.php');
+
+##  Some sites may want leading spaces on markup lines to indicate
+##  "preformatted text blocks", set $EnableWSPre=1 if you want to do
+##  this.  Setting it to a higher number increases the number of
+##  space characters required on a line to count as "preformatted text".
+# $EnableWSPre = 0;                        # PmWiki 2.2.0 default (disabled)
+# $EnableWSPre = 1;                        # lines beginning with space are preformatted
+# $EnableWSPre = 4;                        # lines with 4 spaces are preformatted
+
+##  If you want uploads enabled on your system, set $EnableUpload=1.
+##  You'll also need to set a default upload password, or else set
+##  passwords on individual groups and pages.  For more information
+##  see PmWiki.UploadsAdmin.
+# $EnableUpload = 1;                       
+# $DefaultPasswords['upload'] = crypt('secret');
+
+##  Setting $EnableDiag turns on the ?action=diag and ?action=phpinfo
+##  actions, which often helps others to remotely troubleshoot 
+##  various configuration and execution problems.
+# $EnableDiag = 1;                         # enable remote diagnostics
+
+##  By default, PmWiki doesn't allow browsers to cache pages.  Setting
+##  $EnableIMSCaching=1; will re-enable browser caches in a somewhat
+##  smart manner.  Note that you may want to have caching disabled while
+##  adjusting configuration files or layout templates.
+# $EnableIMSCaching = 1;                   # allow browser caching
+
+##  Set $SpaceWikiWords if you want WikiWords to automatically 
+##  have spaces before each sequence of capital letters.
+# $SpaceWikiWords = 1;                     # turn on WikiWord spacing
+
+##  Set $EnableWikiWords if you want to allow WikiWord links.
+##  For more options with WikiWords, see scripts/wikiwords.php .
+# $EnableWikiWords = 1;                      # enable WikiWord links
+
+##  $DiffKeepDays specifies the minimum number of days to keep a page's
+##  revision history.  The default is 3650 (approximately 10 years).
+# $DiffKeepDays=30;                        # keep page history at least 30 days
+
+## By default, viewers are prevented from seeing the existence
+## of read-protected pages in search results and page listings,
+## but this can be slow as PmWiki has to check the permissions
+## of each page.  Setting $EnablePageListProtect to zero will
+## speed things up considerably, but it will also mean that
+## viewers may learn of the existence of read-protected pages.
+## (It does not enable them to access the contents of the
+## pages.)
+# $EnablePageListProtect = 0;
+
+##  The refcount.php script enables ?action=refcount, which helps to
+##  find missing and orphaned pages.  See PmWiki.RefCount.
+# if ($action == 'refcount') include_once('scripts/refcount.php');
+
+##  The feeds.php script enables ?action=rss, ?action=atom, ?action=rdf,
+##  and ?action=dc, for generation of syndication feeds in various formats.
+# if ($action == 'rss') include_once('scripts/feeds.php');   # RSS 2.0
+# if ($action == 'atom') include_once('scripts/feeds.php');  # Atom 1.0
+# if ($action == 'dc') include_once('scripts/feeds.php');    # Dublin Core
+# if ($action == 'rdf') include_once('scripts/feeds.php');   # RSS 1.0
+
+##  In the 2.2.0-beta series, {$var} page variables are absolute by
+##  default, but a future version will make them relative.  This setting
+##  sets them out as relative to begin with.  (If you're starting a new
+##  site, it's probably best to leave this setting alone.)
+$EnableRelativePageVars = 1;
+
+##  By default, pages in the Category group are manually created.
+##  Uncomment the following line to have blank category pages
+##  automatically created whenever a link to a non-existent
+##  category page is saved.  (The page is created only if
+##  the author has edit permissions to the Category group.)
+# $AutoCreate['/^Category\\./'] = array('ctime' => $Now);
+
+##  PmWiki allows a great deal of flexibility for creating custom markup.
+##  To add support for '*bold*' and '~italic~' markup (the single quotes
+##  are part of the markup), uncomment the following lines. 
+##  (See PmWiki.CustomMarkup and the Cookbook for details and examples.)
+# Markup("'~", "inline", "/'~(.*?)~'/", "<i>$1</i>");        # '~italic~'
+# Markup("'*", "inline", "/'\\*(.*?)\\*'/", "<b>$1</b>");    # '*bold*'
+
+##  If you want to have to approve links to external sites before they
+##  are turned into links, uncomment the line below.  See PmWiki.UrlApprovals.
+##  Also, setting $UnapprovedLinkCountMax limits the number of unapproved
+##  links that are allowed in a page (useful to control wikispam).
+# include_once('scripts/urlapprove.php');
+# $UnapprovedLinkCountMax = 10;
+
+##  The following lines make additional editing buttons appear in the
+##  edit page for subheadings, lists, tables, etc.
+# $GUIButtons['h2'] = array(400, '\\n!! ', '\\n', '$[Heading]',
+#                     '$GUIButtonDirUrlFmt/h2.gif"$[Heading]"');
+# $GUIButtons['h3'] = array(402, '\\n!!! ', '\\n', '$[Subheading]',
+#                     '$GUIButtonDirUrlFmt/h3.gif"$[Subheading]"');
+# $GUIButtons['indent'] = array(500, '\\n->', '\\n', '$[Indented text]',
+#                     '$GUIButtonDirUrlFmt/indent.gif"$[Indented text]"');
+# $GUIButtons['outdent'] = array(510, '\\n-<', '\\n', '$[Hanging indent]',
+#                     '$GUIButtonDirUrlFmt/outdent.gif"$[Hanging indent]"');
+# $GUIButtons['ol'] = array(520, '\\n# ', '\\n', '$[Ordered list]',
+#                     '$GUIButtonDirUrlFmt/ol.gif"$[Ordered (numbered) list]"');
+# $GUIButtons['ul'] = array(530, '\\n* ', '\\n', '$[Unordered list]',
+#                     '$GUIButtonDirUrlFmt/ul.gif"$[Unordered (bullet) list]"');
+# $GUIButtons['hr'] = array(540, '\\n----\\n', '', '',
+#                     '$GUIButtonDirUrlFmt/hr.gif"$[Horizontal rule]"');
+# $GUIButtons['table'] = array(600,
+#                       '||border=1 width=80%\\n||!Hdr ||!Hdr ||!Hdr ||\\n||     ||     ||     ||\\n||     ||     ||     ||\\n', '', '', 
+#                     '$GUIButtonDirUrlFmt/table.gif"$[Table]"');
+

Deleted: trunk/oggdsf/website/downloads.html
===================================================================
--- trunk/oggdsf/website/downloads.html	2008-04-26 10:03:23 UTC (rev 14802)
+++ trunk/oggdsf/website/downloads.html	2008-04-28 00:13:04 UTC (rev 14803)
@@ -1,274 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-  <title>illiminable Ogg Directshow Filters for Speex, Vorbis, Theora and FLAC</title>
-  <meta name="description" content="Directshow Ogg demuxer/muxer with vorbis, speex, FLAC and theora decoders and vorbis, speex encoders.">
-  <meta name="keywords" content="directshow, theora, vorbis, speex, ogg, media player, flac, codec, windows, audio, video, wmp, directX, plugin, plug-in, decoder, encoder, demux, mux, demuxer">
-</head>
-
-<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#DD0000" alink="#FF0000">
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#DDDDDD" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.xiph.org">Xiph.org</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.vorbis.com">Vorbis</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.speex.org">Speex</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.theora.org">Theora</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://flac.sourceforge.net/">FLAC</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.annodex.net">Annodex</a></DIV>
-</FONT>
-</TD>
-
-<TD width=10%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>ogg at illiminable.com</b></DIV>
-</FONT>
-</TD>
-
-</TR>
-
-
-</TABLE>
-</DIV>
-</FONT>
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><b><font size="+2">Download page for Directshow Filters for Ogg Vorbis, Speex, Theora and FLAC</font></b></DIV>
-</FONT>
-</TD>
-</TR>
-
-</TABLE>
-</DIV>
-</FONT>
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#070707" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-<a href="http://www.illiminable.com/ogg">Main Page</a><br>
-<br>
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>About the downloads</b></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-From now on, there will be unstable releases made available. This allows me to keep one stable version for the average user and another version for those who like to keep up with that latest
-features, and are willing to live dangerously. This seems better than what recently has been long delays between releases. This is partly prompted by version 0.72.1838 which has a lot of new code
-and bufixes but which hasn't been thoroughly tested yet. At this stage I plan to keep a more regular unstable release, and possibly in the future a daily or very regular bleeding edge release.
-<br>
-<br>
-Unstable does not necessarily mean that it will crash more. It just means it hasn't been tested, so it may or may not be as stable as a proper release
-<br>
-<br>
-Additionally some major changes to add some new features and in particular to maintain 9X support while moving forward to full unicode support have caused the package size to increase quite dramatically
-from the 800-900k of the previous builds. At some point in the future, I will take some effort to trim this down again, and will also likely start offering two different releases. One with
-only the decoders which will be pretty small, and one with all the encoders and decoders and tools which will be slightly larger.
-<br>
-<br>
-As usual, please report bugs you find to me, being sure to tell me which version you are using.
-<br>
-<br>
-Current priorities - Better encoding support, vista support, tagging, shell integration, Windows Mobile 5 support.
-<br><br>
-<a href="#stable">Latest Stable (0.71.0946)</a><br>
-<a href="#unstable">Latest UNSTABLE (0.72.1838)</a><br>
-
-
-
-
-<a name="stable"></a>
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Current Stable Version (0.71.0946) - 24/02/2006</b></DIV>
-</FONT>
-</TD>
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-<br>
-More bugfixes, particularly to theora. See 0.70 release for more details about recent changes. Docs and source package will be updated on the weekend, there's no major changes there from 0.70. This version is fairly stable now it seems.
-<br>
-<br>
-
-<FONT size=2 color="#000000" face="Arial">
-<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
-
-<TR valign=top>
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows All Versions</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">824,901 bytes</div></DIV></FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_0.71.0946.exe">Download Now</a></div></DIV></FONT>
-</TD>
-</TR>
-
-
-
-</TABLE>
-</DIV>
-</FONT>
-<br>
-
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-<br>
-	<li>Fixed the theora seeking bug, should accurately seek to any frame without artefacts.</li>
-	<li>Fixed bug not handling WMP doing hardware video acceleration, caused crash on some files (Thanks slashdot!)</li>
-	<li>Fixed handling of missing 3xx http response codes</li>
-	<li>Fixed bug where player would crash if you dragged it from one monitor to another while playing</li>
-	<li>Fixed COM reference double-release bug</li>
-	<li>Fixed race condition which could crash or hang sometimes after a seek.</li>
-
-<br>
-<br>
-
-
-<a name="unstable"></a>
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Current UNSTABLE Version (0.72.1838) - 17/9/2006</b></DIV>
-</FONT>
-</TD>
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-<br>
-Major changes in this version include, updating all the code to Visual Studio 2005. There is now a "working" port for Windows Mobile 5.0 as at this revision, this is not yet released. Many minor bugixes and
-compatability fixes, dependancy updates, speed increases, unicode support, improved installer. Some major work was done to maintain Windows 9X/ME support while properly supporting unicode. If
-you use or have an interest in the maintaining of support for these obsolete operating systems, please let me know whether they are working for you.
-<br>
-<br>
-
-<FONT size=2 color="#000000" face="Arial">
-<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
-
-<TR valign=top>
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows All Versions</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">1,426,864 bytes</div></DIV></FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_0.72.1838.exe">Download Now</a></div></DIV></FONT>
-</TD>
-</TR>
-
-
-
-</TABLE>
-</DIV>
-</FONT>
-<br>
-
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-<br>
-	<li>Fixed bug that would refuse to play extremely small files</li>
-	<li>Added YUY2 output support to better support old graphics hardware</li>
-	<li>Updated speex to 1.2beta1</li>
-	<li>Updated project to VS 2005</li>
-	<li>Using theora-exp for theora decoding ~30% speed up</li>
-	<li>Improved 24/32 bit support for FLAC (still may not be perfect)</li>
-	<li>All code moved to unicode. Fixed bug which would fail if paths had unicode chars</li>
-	<li>Custom unicode emulating(unicows) CRT's to maintain Windows 9X support</li>
-	<li>Compatablity fixes for Media Portal and Media Player Classic</li>
-	<li>Installer detects and offers to remove previous versions</li>
-	<li>Installer offers to optionally associate WMP to .ogg</li>
-	<li>MMX optimisations for libtheora ported to MASM, encoding ~25-30% faster</li>
-	<li>Xiph fish icon in explorer</li>
-	<li>Code ported to Windows Mobile 5.0 (currently unreleased build)</li>
-	<li>Switch to integer decoding version of speex</li>
-
-
-
-<br>
-<br>
-
-
-<a href="http://www.illiminable.com/ogg">Main Page</a><br>
-<br>
-</body>
-</html>
-

Deleted: trunk/oggdsf/website/enc_theora_graphedit.html
===================================================================
--- trunk/oggdsf/website/enc_theora_graphedit.html	2008-04-26 10:03:23 UTC (rev 14802)
+++ trunk/oggdsf/website/enc_theora_graphedit.html	2008-04-28 00:13:04 UTC (rev 14803)
@@ -1,102 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-  <title>Encoding Ogg Vorbis + Theora files</title>
-  <meta name="description" content="Directshow Ogg demuxer/muxer with vorbis, speex, FLAC and theora decoders and vorbis, speex encoders.">
-  <meta name="keywords" content="directshow, theora, vorbis, speex, ogg, media player, flac, codec, windows, audio, video, wmp, directX, plugin, plug-in, 
-
-decoder, encoder, demux, mux, demuxer">
-</head>
-<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#FF00FF" alink="#FF0000">
-<a href="http://www.illiminable.com/ogg">Main Page</a><br><br>
-<b><u><font size="+2">How to encode theora files with directshow</font></u></b><br>
-If you have come to this page from an external site, please note before following these steps you need to install the <a href="http://www.illiminable.com/ogg/">directshow filters</a> on my main page.<br><br>
-This brief tutorial explains how to use the directshow filter in association with graphedit to encode or transcode ogg theora. It focuses mainly on transcoding, but by using different source filters you can also encode raw data.<br>
-Graphedit is available in the DirectX9 SDK<br>
-<br>
-
-<u><b>Step 1a - Load File</b></u><br>
-After loading up graphedit, from the file menu choose "Render Media File..." and browse to select the file you want to transcode<br>
-<br><img src="http://www.illiminable.com/ogg/images/select_render_file.JPG" alt="Select render file from the menu">
-<br>
-<br>
-
-<u><b>Step 1b - Rendered Graph</b></u><br>
-If it was successful, you should now have a fully rendered graph, that looks something like this. The exact filters will depends on your source file.<br>
-<br><img src="http://www.illiminable.com/ogg/images/show_rendered_graph.JPG" alt="This is the rendered graph">
-<br>
-<br>
-
-<u><b>Step 2a - Check media types</b></u><br>
-Right click on the pin that inputs to the video renderer, and choose pin properties.<br>
-<br><img src="http://www.illiminable.com/ogg/images/pin_properties.JPG" alt="Select pin proeprties">
-<br>
-<br>
-
-
-<u><b>Step 2b - Ensure YV12 or YUY2</b></u><br>
-On the pin properties page check the media type is either YV12 or YUY2, if it is not, this file can not yet be transcoded directly. If it is then proceed.<br>
-<br><img src="http://www.illiminable.com/ogg/images/ensure_YV12.JPG" alt="Select pin properties">
-<br>
-<br>
-
-
-<u><b>Step 3 - Remove renderers</b></u><br>
-This has rendered a graph for playback, what we want to do is remove the renderers from the graph, and replace them with our encoders and muxer. To remove the renderers click on them, they will get a blue border, then press the delete key. After removing the renderers, the graph should look something like this.<br>
-<br><img src="http://www.illiminable.com/ogg/images/remove_renderers.JPG" alt="This is the rendered graph">
-<br>
-<br>
-
-
-<u><b>Step 4 - Find encoders</b></u><br>
-The first time you will need to find the encoders, by clicking the add filter icon, then selecting the directshow branch of the tree.<br>
-<br><img src="http://www.illiminable.com/ogg/images/find_encoders.JPG" alt="Find the encoders">
-<br>
-<br>
-
-<u><b>Step 5a - Select encoders</b></u><br>
-Find the vorbis encode filter and the theora encode filter, select each one and check the favourite filter box so next time the filter will be under favourites in the menu, click insert filter.<br>
-<br><img src="http://www.illiminable.com/ogg/images/select_encoders.JPG" alt="Select the encoders">
-<br>
-<br>
-
-<u><b>Step 5b - Encoders Added to graph</b></u><br>
-After the encoders have been added to the graph, it should look something like this.<br>
-<br><img src="http://www.illiminable.com/ogg/images/encoders_added.JPG" alt="Graph after encoders added.">
-<br>
-<br>
-
-<u><b>Step 6 - Connect the encoders</b></u><br>
-By dragging the ouput pin of the decoder to the input of the encoder connect the filters together.<br>
-<br><img src="http://www.illiminable.com/ogg/images/connect_encoders.JPG" alt="Connecting encoder pins.">
-<br>
-<br>
-
-<u><b>Step 7 - Open the Theora Encoder Properties</b></u><br>
-Important: *BEFORE* connecting to the muxer, right click the filter and select it's proeprty page.<br>
-<br><img src="http://www.illiminable.com/ogg/images/filter_properties.JPG" alt="Selecting filter proeprties menu item.">
-<br>
-<br>
-
-<u><b>Step 8 - Setup the encoder properties</b></u><br>
-Modify the settings and click apply or ok. Future versions will include more comprehensive options<br>
-<br><img src="http://www.illiminable.com/ogg/images/theora_properties.JPG" alt="Select encoding parameters.">
-<br>
-<br>
-
-<u><b>Step 9 - Select Mux Filter</b></u><br>
-Select the Ogg Mux filter as you previously did for the encoders and connect the encoders to it. As you connect a pin a new one will be spawned.<br>
-Important: Whichever encoder is connected at *the bottom* is one that will appear *first* in the encoded file. <b>This means to make a valid theora file, the vorbis stream is added first to the top pin, then the theora stream to the next pin.</b><br>
-<br><img src="http://www.illiminable.com/ogg/images/select_muxer.JPG" alt="Select Muxer.">
-<br>
-<br>
-
-<u><b>Step 10 - Fully connected graph to play</b></u><br>
-The graph is now ready to go, and should look something like this. Press the play button and wait for the encoding to finish. It is finished when the play button goes green again. Close graphedit... don't press play again or it will overwrite the file. Depending on the source format it may show encoding progress in the progress bar, this is however slightly innacurate... the bar will appear to finish before the encoding has really finished. The progress bar indicates how much data has left the source. Look at the play button or check your processor to usage to see if it has finished.There will always be one empty pin at the bottom of the muxer, this is normal.<br>
-<br><img src="http://www.illiminable.com/ogg/images/fully_connected.JPG" alt="Fully Connected graph">
-<br>
-<br>
-<a href="http://www.illiminable.com/ogg">Main Page</a><br><br>
-
-</body>
-</html>
\ No newline at end of file

Deleted: trunk/oggdsf/website/graphedit.html
===================================================================
--- trunk/oggdsf/website/graphedit.html	2008-04-26 10:03:23 UTC (rev 14802)
+++ trunk/oggdsf/website/graphedit.html	2008-04-28 00:13:04 UTC (rev 14803)
@@ -1,52 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-  <title>illiminable Ogg Directshow Filters - graphedit encoding</title>
-  <meta name="description" content="Directshow Ogg demuxer/muxer with vorbis, speex, FLAC and theora decoders and vorbis, speex encoders.">
-  <meta name="keywords" content=" directshow, theora, vorbis, speex, ogg, media player, codec, audio, video, windows, wmp">
-</head>
-<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#FF00FF" alink="#FF0000">
-
-<a href="http://www.illiminable.com/ogg">Main Page</a><br><br>
-<b><u><font size="+2">Some sample encoding directshow graphs in graphedit</font></u></b><br>
-<br>
-
-<img src="http://www.illiminable.com/ogg/images/wave_to_vorbis_graphedit.JPG" alt="Wave to vorbis graph">
-<br>
-<b><u>Wave to vorbis encoding.</a></u> (Visit <a href="http://www.waixwave.com/index.php">WaixWave</a>)</b>
-<br>
-<br>
-
-<img src="http://www.illiminable.com/ogg/images/mp3_to_vorbis_graphedit.JPG" alt="MP3 to vorbis graph">
-<br>
-<b><u>MP3 to vorbis transcoding.</u></b>
-<br>
-<br>
-
-<img src="http://www.illiminable.com/ogg/images/ogg_split_graphedit.JPG" alt="Splitting multi-stream files graph">
-<br>
-<b><u>Splitting a theora+vorbis file to component parts.</u> (File : <a href="http://www.polycrystal.org/lego/movies.html">Lego Man Movies</a>)</b>
-<br>
-<br>
-
-<img src="http://www.illiminable.com/ogg/images/wma_to_vorbis_graphedit.JPG" alt="WMA to vorbis graph">
-<br>
-<b><u>WMA to vorbis transcoding.</u></b>
-<br>
-<br>
-
-<img src="http://www.illiminable.com/ogg/images/mp3_to_speex_graphedit.JPG" alt="MP3 to speex graph">
-<br>
-<b><u>MP3 to speex transcoding.</u></b>
-<br>
-<br>
-
-<img src="http://www.illiminable.com/ogg/images/vorbis_to_mp3_graphedit.JPG" alt="Vorbis to MP3 graph">
-<br>
-<b><u>Vorbis to MP3 transcoding.</u></b>
-<br>
-<br>
-<a href="http://www.illiminable.com/ogg">Main Page</a><br><br>
-
-</body>
-</html>
\ No newline at end of file

Deleted: trunk/oggdsf/website/history.html
===================================================================
--- trunk/oggdsf/website/history.html	2008-04-26 10:03:23 UTC (rev 14802)
+++ trunk/oggdsf/website/history.html	2008-04-28 00:13:04 UTC (rev 14803)
@@ -1,1343 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-  <title>illiminable Ogg Directshow Filters for Speex, Vorbis, Theora and FLAC</title>
-  <meta name="description" content="Directshow Ogg demuxer/muxer with vorbis, speex, FLAC and theora decoders and vorbis, speex encoders.">
-  <meta name="keywords" content="directshow, theora, vorbis, speex, ogg, media player, flac, codec, windows, audio, video, wmp, directX, plugin, plug-in, decoder, encoder, demux, mux, demuxer">
-</head>
-
-<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#DD0000" alink="#FF0000">
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#DDDDDD" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.xiph.org">Xiph.org</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.vorbis.com">Vorbis</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.speex.org">Speex</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.theora.org">Theora</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://flac.sourceforge.net/">FLAC</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.annodex.net">Annodex</a></DIV>
-</FONT>
-</TD>
-
-<TD width=10%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>ogg at illiminable.com</b></DIV>
-</FONT>
-</TD>
-
-</TR>
-
-
-</TABLE>
-</DIV>
-</FONT>
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><b><font size="+2">History of Directshow Filters for Ogg Vorbis, Speex, Theora and FLAC</font></b></DIV>
-</FONT>
-</TD>
-</TR>
-
-</TABLE>
-</DIV>
-</FONT>
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#070707" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-<a href="http://www.illiminable.com/ogg">Main Page</a><br>
-<br>
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>How it started...</b></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-I first began working on ogg media directshow filters whilst under contract to CSIRO's <a href="http://www.annodex.net">annodex.net</a> project group. Much of the knowledge I needed to write these filters was gained through my work with this project.My initial implementation was for a specific annodex (which uses the ogg encapsulation format)demuxer. Part of my aim of this project was to use the knowledge gained to create a set of filters that works with generic ogg physical streams rather than just a particular physical bitstream format and to release these back to the open source community. There were several limitations to the approach taken to the original annodex filters which is why I decided to start from scratch to design the filter architecture over again with the experience of the first attempt.<br>
-<br>
-Another of my aims of this project is to rewrite the annodex demuxer to use this new design in order for it to be more extensible and easier to work with. This time writing the generic ogg case first and then basing the annodex demuxer on this new design it will increase the consistency of the code between the two modules and provide less trouble integrating new codecs, with the aim of making annodex technology available in the standard applications that come default with windows.<br>
-<br>
-I encourage you all to go and check out the <a href="http://www.annodex.net">annodex project</a> and to consider coding some applications to utilise this new technology. There are many interesting posibilities this new technology presents to continuous media and search technology which will expand the internet to be a richer more dynamic multimedia experience.<br>
-<br>
-Thankyou to CSIRO's annodex.net project group (Silvia Pfeiffer, Conrad Parker and André Pang) for the opportunity to work on this exciting new technology and sparking my interest in directshow and the <a href="http://xiph.org">xiph.org</a> range of codecs.<br>
-<br>
-On the 1st of May 2004, this project began to be maintained in the <a href="http://www.xiph.org">xiph.org</a> subversion repository. It can be found at <a href="http://svn.xiph.org/trunk/oggdsf/">svn.xiph.org/trunk/oggdsf/</a><br>
-<br>
-<br>
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Versions</b></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-<b><font size="+1">Only download these if you have problems with the <a href="http://www.illiminable.com/ogg/">new version</a>.</font></b><br>
-<br>
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.70.0827) - 16/02/2006</b></DIV>
-</FONT>
-</TD>
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-<br>
-Wow... has it been a whole year :) Yes, this project is still alive! There's a fair bit of new code, so if you have problems you might want to try the <a href="http://www.illiminable.com/ogg/history.html">history</a> page and get version 0.69. One notable thing that this new version does not do correctly, is it no longer handles chained icecast streams, but it handles streaming static files on a server much better. The previous solution for icecast was a real hack which is no longer possible, it will be fixed properly fairly soon.
-<br>
-<br>
-I'm releasing now, because otherwise you'll be waiting forever! Releases should be coming much more frequently hopefully. As always, email me your bugs and feature requests. The unicode filenames will be fixed as soon as I can, sorry, I keep putting that one off.
-<br>
-<br>
-
-<FONT size=2 color="#000000" face="Arial">
-<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
-
-<TR valign=top>
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows All Versions</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">824,581 bytes</div></DIV></FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_0.70.0827.exe">Download Now</a></div></DIV></FONT>
-</TD>
-</TR>
-
-
-
-</TABLE>
-</DIV>
-</FONT>
-
-<b><u></u></b><br>
-	<li>Theora can seek without artefacts to any frame, even non-keyframes.(95% of the time, there's still a slight bug)</li>
-	<li>All seeking in all codecs is accurate to within a single audio sample (ie. sub-second)</li>
-	<li>Complete rewrite of demux, it's much easier for me to continue now.</li>
-	<li>OGM support is improved a bit, still not great. It does not associate with the .ogm extension to avoid messing with other solutions for .ogm you might have. But renaming the .ogm file to .ogg it will attempt to play it.</li>
-	<li>Improved handling of static files on servers (still not seeking over http)</li>
-	<li>Be aware that it builds a seektable for all on-disk files. For really large files (>250MB) it may take a little while for the file to load</li>
-	<li>Updated most libraries, vorbis is still at 1.1.1, speex still 1.1.10. Another release soonish may rectify this. I just want to release what I've got now, or it will keep being put off.</li>
-
-<br>
-<br>
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.69.8924) - 15/02/2005</b></DIV>
-</FONT>
-</TD>
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-<br>
-Lots of bufixes, especially memory leaks and memory management. Along with a new installer based on <a href="http://nsis.sourceforge.net/">NSIS</a>, which is just click-and-run.
-<br>
-<br>
-
-<FONT size=2 color="#000000" face="Arial">
-<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
-
-<TR valign=top>
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows All Versions</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">816,782 bytes</div></DIV></FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_0.69.8924.exe">Download Now</a></div></DIV></FONT>
-</TD>
-</TR>
-
-
-
-</TABLE>
-</DIV>
-</FONT>
-<br>
-
-
-<b><u></u></b><br>
-	<li>Removed several major memory leaks in encoders and decoders</li>
-	<li>More intelligent buffer sizing, reduces memory footprint about about 5-10 fold</li>
-	<li>Much more <a href="http://www.illiminable.com/ogg/docs/index.html">documentation</a></li>
-	<li>Vorbis encoder has programmatic interface for setting quality</li>
-	<li>Annodex Muxing support</li>
-	<li>Programmitic interface for encoding progress</li>
-	<li>Can seek in WMP6.4</li>
-	<li>Several other tools (not included in this binary) for server side seeking, and .NET media players added to <a href="http://www.illiminable.com/ogg/about_sdk.html">SDK</a></li>
-<br>
-<br>
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.68.8333) - 06/12/2004</b></DIV>
-</FONT>
-</TD>
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-<br>
-Mainly bugfixes.
-<br>
-<br>
-
-<FONT size=2 color="#000000" face="Arial">
-<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
-
-<TR valign=top>
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows XP</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">994,706 bytes</div></DIV></FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_XP_0.68.8333.zip">Download Now</a></div></DIV></FONT>
-</TD>
-</TR>
-
-
-
-<TR valign=top>
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows NT/2000</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">2,777,163 bytes</div></DIV></FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_2K_0.68.8333.zip">Download Now</a></div></DIV></FONT>
-</TD>
-</TR>
-
-
-
-
-<TR valign=top>
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows 98/ME</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">2,662,269 bytes</div></DIV></FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_9X_0.68.8333.zip">Download Now</a></div></DIV></FONT>
-</TD>
-</TR>
-
-</TABLE>
-</DIV>
-</FONT>
-<br>
-
-
-<b><u></u></b><br>
-	<li>Fixed playback from windows network drives.</li>
-	<li>Fixed bug where audio would stop if you seek really close to the end.</li>
-	<li>Seeking performance back to almost instant</li>
-<br>
-<br>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.67.8171) - 05/11/2004</b></DIV>
-</FONT>
-</TD>
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-<br>
-Added support for playing native flac files (.flac). No major bufixes in this release, I'm quite busy at the moment, but a new version which addresses many of 
- the outstanding bugs will be ready in 2-3 weeks. Thanks for being patient.</br>
-<br>
-<br>
-
-<FONT size=2 color="#000000" face="Arial">
-<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
-
-<TR valign=top>
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows XP</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">969,047 bytes</div></DIV></FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_XP_0.67.8171.zip">Download Now</a></div></DIV></FONT>
-</TD>
-</TR>
-
-
-
-<TR valign=top>
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows NT/2000</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">2,751,504 bytes</div></DIV></FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_2K_0.67.8171.zip">Download Now</a></div></DIV></FONT>
-</TD>
-</TR>
-
-
-
-
-<TR valign=top>
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows 98/ME</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">2,636,610 bytes</div></DIV></FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_9X_0.67.8171.zip">Download Now</a></div></DIV></FONT>
-</TD>
-</TR>
-
-</TABLE>
-</DIV>
-</FONT>
-<br>
-
-<b><u></u></b><br>
-	<li>Now supports native FLAC (.flac files) without ogg container.</li>
-<br>
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.66.8063) - 21/10/2004</b></DIV>
-</FONT>
-</TD>
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-<br>
-Added support for the new Ogg FLAC format and fixed that Explorer problem with locked files. A fair bit of internal shuffling, but mainly a whole lot of memory leaks have been eliminated.<br>
-<br>
-<br>
-
-<FONT size=2 color="#000000" face="Arial">
-<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
-
-<TR valign=top>
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows XP</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">952,518 bytes</div></DIV></FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_XP_0.66.8063.zip">Download Now</a></div></DIV></FONT>
-</TD>
-</TR>
-
-
-
-<TR valign=top>
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows NT/2000</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">2,734,975 bytes</div></DIV></FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_2K_0.66.8063.zip">Download Now</a></div></DIV></FONT>
-</TD>
-</TR>
-
-
-
-
-<TR valign=top>
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows 98/ME</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">2,620,081 bytes</div></DIV></FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_9X_0.66.8063.zip">Download Now</a></div></DIV></FONT>
-</TD>
-</TR>
-
-</TABLE>
-</DIV>
-</FONT>
-<br>
-
-<b><u></u></b><br>
-	<li>FLAC can now be muxed into a multi-stream file.</li>
-	<li>Now supports both the new Ogg FLAC (1.1.1) and the old Ogg FLAC (still not native FLAC)</li>
-	<li>Fixed the explorer problem by removing the offending registry key at installation</li>
-	<li>Removed a heap of memory leaks, WMP should run a fair bit leaner now</li>
-	<li>Some internal changes to the queueing mechanism</li>
-	<li>There's some skeleton <a href="http://www.illiminable.com/ogg/docs/index.html">API documentation</a> for developers. It's pretty sparse on info still though.</li>
-<br>
-<br>
-
-
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.65.7923) - 07/10/2004</b></DIV>
-</FONT>
-</TD>
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-<br>
-Added support for icecast vorbis streams. Works for most streams, though there is a limitation that the stream can't change codebooks, or audio settings mid-stream, but 
-this shouldn't be a problem for most streams. Also an internal fix on the format blocks of the filters. To use icecast streams in WMP you need paste the url in to the 
-Open Url dialog box (File->Open URL...). WMP doesn't support .pls files... so if this is what form the stream takes, for now, you need to save the .pls file, and copy-paste 
-the link that is inside it into WMP.
-
-
-<br>
-<br>
-Most of the major functionality bugs are sorted out now, I'm quite happy with this release and the previous one, though still a way to go.
-<br>
-<br>
-<FONT size=2 color="#000000" face="Arial">
-<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
-
-<TR valign=top>
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows XP</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">938,166 bytes</div></DIV></FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_XP_0.65.7923.zip">Download Now</a></div></DIV></FONT>
-</TD>
-</TR>
-
-
-
-<TR valign=top>
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows NT/2000</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">2,720,623 bytes</div></DIV></FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_2K_0.65.7923.zip">Download Now</a></div></DIV></FONT>
-</TD>
-</TR>
-
-
-
-
-<TR valign=top>
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows 98/ME</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">2,605,729 bytes</div></DIV></FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_9X_0.65.7923.zip">Download Now</a></div></DIV></FONT>
-</TD>
-</TR>
-
-</TABLE>
-</DIV>
-</FONT>
-<br>
-
-
-<b><u></u></b><br>
-	<li>Can now play most vorbis icecast streams.</li>
-	<li>Fixed some random values in the format blocks (Thanks to Robert Huitl for reporting this.)</li>
-<br>
-<br>
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.64.7878) - 25/09/2004</b></DIV>
-</FONT>
-</TD>
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-<br>
-Fixed up the seeking in WMP 9 and 10 mainly... and a few other fixes. Also added more colour space conversions for the encoder.
-<br>
-<br>
-<br>
-<FONT size=2 color="#000000" face="Arial">
-<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows XP</DIV>
-</FONT>
-</TD>
-
-
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">948,458 bytes</div></DIV></FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_XP_0.64.7878.zip">Download Now</a></div></DIV></FONT>
-</TD>
-
-</TR>
-
-
-
-<TR valign=top>
-
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows NT/2000</DIV>
-</FONT>
-</TD>
-
-
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">2,730,915 bytes</div></DIV></FONT>
-</TD>
-
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_2K_0.64.7878.zip">Download Now</a></div></DIV></FONT>
-</TD>
-
-</TR>
-
-
-
-
-<TR valign=top>
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows 98/ME</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">2,616,021 bytes</div></DIV></FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_9X_0.64.7878.zip">Download Now</a></div></DIV></FONT>
-</TD>
-</TR>
-
-</TABLE>
-</DIV>
-</FONT>
-<br>
-
-
-<b><u></u></b><br>
-	<li>Fixed seeking in WMP 9 and 10.</li>
-	<li>Fixed a bug using the WMP activeX control.</li>
-	<li>Theora encoder accepts new media types ie RGB24, RGB32, AYUV, IYUV, UYVY, YVYU... only RGB32 has been tested, as i don't have any source of the other types.</li>
-<br>
-<br>
-
-
-
-
-
-
-
-
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.63.7755) - 13/09/2004</b></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-<br>
-I put the installers back in the packages. Just makes it easier for people who aren't computer savvy. Also theora now plays in WMP9 and 10 (but still can't seek in these two players). 
-Also fixed a bug in the speex encoder that made a mess of theora+speex files. Fixed a few more memory leaks.<br>
-<br>
-<br>
-<FONT size=2 color="#000000" face="Arial">
-<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows XP</DIV>
-</FONT>
-</TD>
-
-
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">950,311 bytes</div></DIV></FONT>
-</TD>
-
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_XP_0.63.7755.zip">Download Now</a></div></DIV></FONT>
-</TD>
-
-</TR>
-
-
-
-<TR valign=top>
-
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows NT/2000</DIV>
-</FONT>
-</TD>
-
-
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">2,732,768 bytes</div></DIV></FONT>
-</TD>
-
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_2K_0.63.7755.zip">Download Now</a></div></DIV></FONT>
-</TD>
-
-</TR>
-
-
-
-
-<TR valign=top>
-
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows 98/ME</DIV>
-</FONT>
-</TD>
-
-
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">2,617,874 bytes</div></DIV></FONT>
-</TD>
-
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_9X_0.63.7755.zip">Download Now</a></div></DIV></FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-<br>
-
-
-<b><u></u></b><br>
-	<li>Fixed a few memory leaks... there are still more left though.</li>
-	<li>Fixed some bugs in speex encoder. Can now make proper speex+theora files</li>
-	<li>Theora playback works in WMP 9 and 10 now... but no seeking in these two players</li>
-	<li>Fixed a muxing problem with large packets.</li>
-	<li>Increased some of the buffer sizes. Trying to encode very high quality theora was crashing as the buffer was too small</li>
-<br>
-<br>
-
-
-
-
-
-
-
-
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.62.7673) - 01/09/2004</b></DIV>
-</FONT>
-</TD>
-
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-To stop people unnecessarily downloading the windows installer over and over, the packages will no longer include the installer. If you have a pre-XP 
-windows, and don't already have the windows installer on your system (almost everyone who has ever installed something should have it already) you can
-download the installer seperately from the links at the top of the page.<br>
-<br>
-Fixed the network streaming, and removed all the .NET sample apps from this release. <a href="http://www.illiminable.com/ogg/sse_builds.html">Experimental SSE/SSE2 builds can be found here</a><br>
-Changed the installer a bit so people realise when they download via download "shell sites", which hide the true source of the download, where it came from and where to look for updates.<br>
-<br>
-<FONT size=2 color="#000000" face="Arial">
-<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows 98/ME/NT/2K/XP</DIV>
-</FONT>
-</TD>
-
-
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">942,859 bytes</div></DIV></FONT>
-</TD>
-
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_0.62.7673.zip">Download Now</a></div></DIV></FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-<br>
-	<li>Fixed a few memory leaks... there are still more left though.</li>
-	<li>Removed all the .NET sample applications to avoid those without .NET being forced to install it.</li>
-	<li>Streaming greatly improved. Will now cache a file as it streams in the TEMP directory as specified in environment variables.</li>
-	<li>Made experimental SSE/SSE2 optimised builds of all libraries.</li>
-	<li>Changed the installer so that you have to click through the BSD licenses, and to show where the software came from as many sites are linking directly to the .zip files so users are not getting the opportunity to read about known issues, or even know if they are getting the current version.</li>
-<br>
-
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.61.7571) - 16/08/2004</b></DIV>
-</FONT>
-</TD>
-
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-
-
-To stop people unnecessarily downloading the windows installer over and over, the packages will no longer include the installer. If you have a pre-XP 
-windows, and don't already have the windows installer on your system (almost everyone who has ever installed something should have it already) you can
-download the installer seperately from the links at the top of the page.<br>
-<br>
-Fixed a few bugs in theora, seeking almost never crashes now. FLAC playback and seeking now works properly, though not extensively tested. Includes a FLAC encoder filter. Starting from the
-next release I will start offering different build configurations, ie minimal decode only installation, builds with SSE2 optimisations etc.<br>
-<br>
-
-
-
-<FONT size=2 color="#000000" face="Arial">
-<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows 98/ME/NT/2K/XP</DIV>
-</FONT>
-</TD>
-
-
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">1,076,031 bytes</div></DIV></FONT>
-</TD>
-
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_0.61.7571.zip">Download Now</a></div></DIV></FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-<br>
-
-	<li>Fixed seeking crash problems with theora</li>
-	<li>Fixed FLAC playback</li>
-	<li>Added a FLAC encoder filter</li>
-	<li>Added a very simple .NET media player called DNPlay</li>
-	<li>Added a .NET directshow playback library</li>
-	<li>Added a validation program for ogg files OOOggValidate</li>
-<br>
-
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.60.7043) - 08/07/2004</b></DIV>
-</FONT>
-</TD>
-
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-
-Quite a fair bit added this time, most notably an encoder for theora... see <a href="http://www.illiminable.com/ogg/enc_theora_graphedit.html">Encoding theora</a><br>
-Only a few encoding parameters are currently exposed via a filter property page. Also modified the demuxer so it can handle http streams though there are some issues. The buffering is very simple, it doesn't optimise buffer based on bandwidth. Network steams are currently non-seekable. Also only non-chained
-files should be streamed. Most encoded files are not chained. However some icecast streams, Which are not continuous, have breaks where songs change, this type of stream will likely crash the media player. However continuous live streams... such as radio broadcasts etc generally work fine. The network streaming has only recently be added, so i expect it to still be fairly buggy.<br>
-<br>
-To all the people interested in FLAC, I will be spending some time sorting out the bugs that have been there for ages very soon, thanks for your patience !<br>
-<br>
-This release has a lot of new code added, I'd really appreciate feedback on the installation process, and the encoding. I will leave the links to the previous version up for a while further down the page.<br>
-
-<br>
-	<li>Added <a href="http://www.annodex.net/TR/draft-pfeiffer-cmml-01.html">CMML</a> Decoder filter</li>
-	<li>Added a simple subtitle renderer based on VMR 9</li>
-	<li>Added an OO vorbis comment parsing library</li>
-	<li>Added an example tool called OOOggCommentDump which dumps comment information from the first stream in a file</li>
-	<li>Added container class library for <a href="http://www.annodex.net/TR/draft-pfeiffer-cmml-01.html">CMML</a></li>
-	<li>Added minimal <a href="http://www.annodex.net/TR/draft-pfeiffer-cmml-01.html">CMML</a> parsing library based on MSXML</a>
-	<li>Added a demuxer filter for <a href="http://www.annodex.net/">Annodex</a>, will only play in graphedit currently, and needs to manually build graphs to include the VMR9 as video renderer, also won't play the mpeg coded videos that are on the annodex site.</li>
-	<li>Added network support for demuxer to stream .ogg files</li>
-	<li>Fixed the speex encoder (I think)</li>
-	<li>Ogg Mux filter now supports multiple stream muxing</li>
-	<li>Added a theora encode filter, with a minimal configurable property page</li>
-	<li>Theora encode filter supports YUY2 input (generally from mpeg) or YV12 (generally from avi codecs, in particular those decoded by ffdshow)</li>
-	<li>Fixed some bad implementation of frame offsets in the theora decoder</li>
-	<li>Now files can be added to the WMP9+ Media Library, however no media metadata is yet extracted from the vorbis comments. Nor can you currently use the rip or burn functionality.</li>
-
-<br>
-<br>
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.57.6744) - 22/05/2004</b></DIV>
-</FONT>
-</TD>
-
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-Previous release a few hours ago had hundreds of debug statements in the release build. It may have created log files in your C:\ Root directory as well as C:\temp and possibly in G:\ if you have a writable G drive. Sorry if you got this a few hours ago.
-<br>
-	<li>Removed a whole heap of debugging code.</li>
-	<li>See 0.56.6741 release below for latest changes.</li>
-
-<br>
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.56.6741) - 21/05/2004</b></DIV>
-</FONT>
-</TD>
-
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-Most of the changes in this build are internal modifications to better deal with the need to determine start times of all samples in order to properly synchronise multi-stream files. The main externally visible change is the limited ability to seek in theora files without total loss of synch. There are still a few issues to be ironed out though.
-<br>
-	<li>Modified internal timestamping mechanism, to allow resynch easier in theora.</li>
-	<li>Now able to seek in theora (not to keyframe), but occasionally crashes after seek.</li>
-	<li>Speex and vorbis, don't have seg fault any more, though very rarely after a seek there is no audio. Another seek fixes it.</li>
-	<li>Added simple new tool called OOOggStat, to give info on contained streams.</li>
-
-<br>
-
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.55.0115) - 27/04/2004</b></DIV>
-</FONT>
-</TD>
-
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-
-Vorbis and speex playback are now pretty much finished bar the very rare bug I mention below. I've played dozens of speex and vorbis files and they all seem just fine. Pretty much fully functional.<br>
-The track duration shows up incorrectly in all codecs besides speex and vorbis because I haven't coded it yet !<br>
-A seek table is built as the file is loaded... this is currently done by basicly processing the entire file... so there may be a small delay loading large files. When I get time I'll replace this with a better method that doesn't try and process the entire file, but can skip through to the relevant parts.<br>
-	<li>NOTE: I suggest you don't distribute files encoded with these codecs yet... there may still be problems with them</li>
-	<li>Fixed clumpy playback of divx, bad timestamping</li>
-	<li>Added seeking, duration and position info to vorbis and speex</li>
-	<li>Fixed a few internal errors with regards to timestamping</li>
-	<li>Added a seek table for rapid seeking</li>
-<br>
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.52.0093) - 18/04/2004</b></DIV>
-</FONT>
-</TD>
-
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-
-	<li>NOTE: I suggest you don't distribute files encoded with these codecs yet... there may still be problems with them</li>
-	<li>See version 0.50.0090 for information</li>
-	<li>Now checksums pages properly.</li>
-	<li>Properly organises initial header packets in pages.</li>
-	
-
-<br>
-
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.51.0092) - 18/04/2004</b></DIV>
-</FONT>
-</TD>
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-	<li>See version 0.50.0090 for information</li>
-	<li>Stuffed up some packaging and linking in the last version... probably won't affect it, but just to be safe, did rebuild and package. Sorry if you got it 5 minutes ago !</li>
-	
-<br>
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.50.0090) - 18/04/2004</b></DIV>
-</FONT>
-</TD>
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-Start of encoding support has been added... see <a href="http://www.illiminable.com/ogg/graphedit.html">example filter graphs</a>. Use graphedit (<a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9216652f-51e0-402e-b7b5-feb68d00f298&displaylang=en">DirectX9 SDK</a>)</li>
-	<li>Added support for OGM style video encapsulation *decode only*, requires <a href="http://sourceforge.net/projects/ffdshow">ffdshow</a>. Should recognise any format ffdshow can handle. (Video quite clumpy at the moment)</li>
-	<li>Added single stream Ogg Muxer... for muxing theora, speex and vorbis</li>
-	<li>Added vorbis encoder filter</li>
-	<li>Added speex encoder filter</li>
-	<li>Included Abstract Audio Encoder library</li>
-	
-<br>
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.40.0069) - 08/04/2004</b></DIV>
-</FONT>
-</TD>
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-
-
-This new release completes the basic functionality for the four major codecs, though there are still bugs. Theora hasn't been extensively tested
-as I don't have many test files to work with. FLAC is still pretty buggy... theora less so... but still buggy.
-	<li>NOTE: Untested with DirectX 8 or lower. I'm pretty sure theora will only play with DX9. Others *should* work with DX8.</li>
-	<li>Added basic Theora support (alpha 3 *only*, previous bitstream formats are depracated). See issues below.</li>
-	<li>Included OO Theora wrapper library</li>
-	<li>Included Abstract Video Decoder library</li>
-<br>
-<br>
-
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.30.0058) - 31/03/2004</b></DIV>
-</FONT>
-</TD>
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-
-Just thought I'd release this update. It includes some FLAC support but it's very buggy, I suggest you don't use FLAC just yet.<br>
-Vorbis and speex are the same as before but with below changes. Vorbis and Speex won't crash<br>
-	<li>Fixed bug in stream recogniser which defaulted unknown to speex.</li>
-	<li>Fixed minor defect in audio when stopping and replaying</li>
-	<li>Split Vorbis and Speex to seperate filters</li>
-	<li>Included Abstract Codec Library</li>
-	<li>Now ignores unknown streams. ie. Playing a theora/vorbis will only play the vorbis</li>
-	<li>Major abstractions to demux filter in preperation for theora/annodex</li>
-	<li>Included very basic Ogg FLAC playback (very buggy, see below, update in a day or two to fix)</li>
-	<li>Included one of my basic debugging tools. OOOggDump. Usage : OOOggDump filename, be sure to redirect output to a file</li>
-<br>
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.22.0035) - 24/03/2004</b></DIV>
-</FONT>
-</TD>
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-	<li>Updated libfishsound to 0.6.0</li>
-	<li>Changes to attribution text files.</li>
-	<li>Release builds with compiler optimisations.</li>
-<br>
-<br>
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.21.0032) - 24/03/2004</b></DIV>
-</FONT>
-</TD>
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-	<li>Fixed audio defects.</li>
-	<li>Added clipping to account for out of range floats from vorbis</li>
-	<li>Updated vorbis to 1.0.1 and speex to 1.0.3</li><br>
-<br>
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.20.0022) - 23/03/2004</b></DIV>
-</FONT>
-</TD>
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-	<li>Added support for speex.</li>
-	<li>Recognises speex files with .ogg .spx or .speex extensions</li><br>
-<br>
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.11.0020) - 22/03/2004</b></DIV>
-</FONT>
-</TD>
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-	<li>Removed several memory leaks.</li>
-	<li>Media Player doesn't make the error sound on exiting any more.</li>
-	<li>Fixed a few crashing bugs that only show up in graphedit by doing stupid things.</li>
-	<li>Package is more compressed now.</li>
-	<li>Fixed a crashing bug in libfishsound</li><br>
-<br>
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Previous Version (0.10.0019) - 22/03/2004</b></DIV>
-</FONT>
-</TD>
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-	<li>Initial binary release.</li><br>
-<br>
-<a href="http://www.illiminable.com/ogg">Main Page</a><br>
-<br>
-</body>
-</html>
-

Deleted: trunk/oggdsf/website/index.html
===================================================================
--- trunk/oggdsf/website/index.html	2008-04-26 10:03:23 UTC (rev 14802)
+++ trunk/oggdsf/website/index.html	2008-04-28 00:13:04 UTC (rev 14803)
@@ -1,336 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-  <title>illiminable Ogg Directshow Filters for Speex, Vorbis, Theora and FLAC</title>
-  <meta name="description" content="Directshow Ogg demuxer/muxer with vorbis, speex, FLAC and theora decoders and encoders.">
-  <meta name="keywords" content="directshow, theora, vorbis, speex, ogg, media player, flac, codec, windows, audio, video, wmp, directX, plugin, plug-in, decoder, encoder, demux, mux, demuxer">
-</head>
-<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#DD0000" alink="#FF0000">
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#DDDDDD" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.xiph.org">Xiph.org</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.vorbis.com">Vorbis</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.speex.org">Speex</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.theora.org">Theora</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://flac.sourceforge.net/">FLAC</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.annodex.net">Annodex</a></DIV>
-</FONT>
-</TD>
-
-<TD width=10%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>ogg at illiminable.com</b></DIV>
-</FONT>
-</TD>
-
-</TR>
-
-
-</TABLE>
-</DIV>
-</FONT>
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><b><font size="+2">Directshow Filters for Ogg Vorbis, Speex, Theora and FLAC</font></b></DIV>
-</FONT>
-</TD>
-</TR>
-
-</TABLE>
-</DIV>
-</FONT>
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#070707" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-
-
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><a href="http://www.illiminable.com/ogg/">Home</a></DIV>
-</FONT>
-</TD>
-
-<TD width=10%><FONT size=2 color="#000000" face="Arial">
-<DIV></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/downloads.html">Downloads</a></DIV>
-</FONT>
-</TD>
-
-
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/developers.html">Developer Info</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/history.html">History</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/docs/index.html">Documentation</a></DIV>
-</FONT>
-</TD>
-
-<TD width=15%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/about_sdk.html">About</a></DIV>
-</FONT>
-</TD>
-
-</TR>
-
-
-</TABLE>
-</DIV>
-</FONT>
-
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#070707" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-
-
-
-
-
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Installation</b></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-
-
-<li>Uninstall any previous version of these filters.(<b>This is important!</b>) Go to add remove programs, remove oggcodecs</li>
-<li>Make sure media player or any directshow applications are closed.</li>
-<li>Run the installer.</li>
-<br>
-Then Windows Media Player or any other directshow application (eg. BSPlayer) will be able to play Ogg Vorbis, Ogg Speex, Ogg Theora, Ogg FLAC and native FLAC.<br>
-<br>
-Starting with version 0.72.1838, development will now be split into a stable and unstable branch. That way, those who just want to play their files can get the stable version, and those who 
-want to live dangerously can get the latest new features without having to wait for me to do proper testing. You can find the <b>unstable builds</b> on the <a href="http://www.illiminable.com/ogg/downloads.html">download page</a>.
-Most users should download the stable version below.
-<br>
-
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Current Stable Version (0.71.0946) - 24/02/2006</b></DIV>
-</FONT>
-</TD>
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-<br>
-More bugfixes, particularly to theora. See 0.70 release for more details about recent changes. Docs and source package will be updated on the weekend, there's no major changes there from 0.70. This version is fairly stable now it seems.
-<br>
-<br>
-
-<FONT size=2 color="#000000" face="Arial">
-<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
-
-<TR valign=top>
-<TD width=40%><FONT size=2 color="#000000" face="Arial">
-<DIV>Ogg Codecs for windows</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV>Windows All Versions</DIV>
-</FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right">824,901 bytes</div></DIV></FONT>
-</TD>
-<TD width=20%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_0.71.0946.exe">Download Now</a></div></DIV></FONT>
-</TD>
-</TR>
-
-
-
-</TABLE>
-</DIV>
-</FONT>
-<br>
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Changes this version</b></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-<b><u></u></b><br>
-	<li>Fixed the theora seeking bug, should accurately seek to any frame without artefacts.</li>
-	<li>Fixed bug not handling WMP doing hardware video acceleration, caused crash on some files (Thanks slashdot!)</li>
-	<li>Fixed handling of missing 3xx http response codes</li>
-	<li>Fixed bug where player would crash if you dragged it from one monitor to another while playing</li>
-	<li>Fixed COM reference double-release bug</li>
-	<li>Fixed race condition which could crash or hang sometimes after a seek.</li>
-
-<br>
-<br>
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Known issues.</b></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-	<li>Can't play file with names that use extended character sets (ie Japanese) under certani locales of windows (Thanks Liisachan)</li>
-	<li>AVI Video files encoded with non-integral framerates (ie 29.97) may lose sync, due to rounding bug (Thanks RadicalEd)</li>
-	<li>Make the installer properly detect if it's already installed. If you don't uninstall the old version you will get multiple identical file masks in WMP</li>
-	<li>If you are getting codec problems, there appears to be a conflict with something in Media Player Classic... it tries to enforce the use of another ogg demultiplexer, either by design or accident.If you see in MPC it complaining about a media subtype with a 
-		GUID {CDDCA2D5-6D75-4F98-840E-737BEDD5C63B}. This is the guid of the old tobias vorbis filter, and this one {8D2FD10B-5841-4a6b-8905-588FEC1ADED9} is CoreVorbis. This is most likely due to the fact that these filters don't clean up the registry when they uninstall.
-		I am working on something to "clean up" all these remnants from the registry (don't expect it too soon though... it's not that high priority). You can also apparently an option to disable the inbuilt demuxer (Thanks Bond)</li>
-	<li>Cannot handle any chained multiplexed files or streams.</li>
-
-<br>
-<br>
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"><b>Other stuff<br></b></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-
-<li>Also you can encode vorbis, speex, FLAC and theora files using graphedit(<a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9216652f-51e0-402e-b7b5-feb68d00f298&displaylang=en">DirectX9 SDK</a>) or other similar program.</li>
-<li><a href="http://www.illiminable.com/ogg/graphedit.html">See audio encoding example filter graphs</a></li>
-<li><a href="http://www.illiminable.com/ogg/enc_theora_graphedit.html">Theora encoding how-to</a></li>
-<li>If you install <a href="http://sourceforge.net/projects/ffdshow">ffdshow</a>, you will be able to play ogm files (sometimes at least!)</li>
-<li>Also, if you download, install and register <a href="http://sourceforge.net/project/showfiles.php?group_id=82303&package_id=84799">Gabests .cda directshow source</a> you can rip CD's using graphedit</li>
-<li>Looking for <a href="http://www.illiminable.com/ogg/history.html">old versions</a> ?</li>
-<li>Want the <a href="http://www.illiminable.com/ogg/oggcodecs_src_0.70.0827.zip">zipped source code</a> (10.5 MB zipped, 37MB unzipped) ?</li>
-<li>Want to <a href="http://svn.xiph.org/trunk/oggdsf/">browse the source on the web</a> </li>
-<li><a href="http://www.illiminable.com/ogg/sse_builds.html">Experimental SSE/SSE2 builds can be found here</a></li>
-<li>Some basic <a href="http://www.illiminable.com/ogg/docs/index.html">API documentation</a> for developers</li>
-<br>
-
-<FONT size=2 color="#101010" face="Arial">
-<DIV><TABLE width=100% bgcolor="#070707" border=0 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-
-<TD width=100%><FONT size=2 color="#000000" face="Arial">
-<DIV><div align="left"></DIV>
-</FONT>
-</TD>
-
-</TR>
-</TABLE>
-</DIV>
-</FONT>
-</body>
-</html>
-

Added: trunk/oggdsf/website/index.php
===================================================================
--- trunk/oggdsf/website/index.php	                        (rev 0)
+++ trunk/oggdsf/website/index.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1 @@
+<?php include('pmwiki.php');

Added: trunk/oggdsf/website/local/.htaccess
===================================================================
--- trunk/oggdsf/website/local/.htaccess	                        (rev 0)
+++ trunk/oggdsf/website/local/.htaccess	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,12 @@
+# This file is local/.htaccess -- the default distribution contains this
+# file to prevent local/ scripts from being accessed directly by browsers
+# (this is a potential, albeit very unlikely, security hole).
+#
+# If you alter or replace this file, it will likely be overwritten when
+# you upgrade from one version of PmWiki to another.  Be sure to save
+# a copy of your alterations in another location so you can restore them,
+# and you might try changing this file to be read-only to prevent a PmWiki
+# upgrade from overwriting your altered version.
+
+Order Deny,Allow
+Deny from all

Added: trunk/oggdsf/website/local/config.php
===================================================================
--- trunk/oggdsf/website/local/config.php	                        (rev 0)
+++ trunk/oggdsf/website/local/config.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,163 @@
+<?php if (!defined('PmWiki')) exit();
+##  This is a sample config.php file.  To use this file, copy it to
+##  local/config.php, then edit it for whatever customizations you want.
+##  Also, be sure to take a look at http://www.pmichaud.com/wiki/Cookbook
+##  for more details on the types of customizations that can be added
+##  to PmWiki.  
+
+##  $WikiTitle is the name that appears in the browser's title bar.
+$WikiTitle = 'Directshow Filters for Ogg Vorbis, Speex, Theora and FLAC';
+
+##  $ScriptUrl is your preferred URL for accessing wiki pages
+##  $PubDirUrl is the URL for the pub directory.
+# $ScriptUrl = 'http://www.mydomain.com/path/to/pmwiki.php';
+# $PubDirUrl = 'http://www.mydomain.com/path/to/pub';
+
+##  If you want to use URLs of the form .../pmwiki.php/Group/PageName
+##  instead of .../pmwiki.php?p=Group.PageName, try setting
+##  $EnablePathInfo below.  Note that this doesn't work in all environments,
+##  it depends on your webserver and PHP configuration.  You might also 
+##  want to check http://www.pmwiki.org/wiki/Cookbook/CleanUrls more
+##  details about this setting and other ways to create nicer-looking urls.
+$EnablePathInfo = 1;
+
+## $PageLogoUrl is the URL for a logo image -- you can change this
+## to your own logo if you wish.
+# $PageLogoUrl = "$PubDirUrl/skins/pmwiki/pmwiki-32.gif";
+$PageLogoUrl = "http://www.xiph.org/images/logos/white-xifish.gif";
+
+## If you want to have a custom skin, then set $Skin to the name
+## of the directory (in pub/skins/) that contains your skin files.
+## See PmWiki.Skins and Cookbook.Skins.
+$Skin = 'barthelme';
+$EnableMenuBar = TRUE;
+
+## You'll probably want to set an administrative password that you
+## can use to get into password-protected pages.  Also, by default 
+## the "attr" passwords for the PmWiki and Main groups are locked, so
+## an admin password is a good way to unlock those.  See PmWiki.Passwords
+## and PmWiki.PasswordsAdmin.
+$DefaultPasswords['admin'] = crypt('secretOggdsf');
+$DefaultPasswords['edit'] = crypt('secretOggdsf');
+$DefaultPasswords['attr'] = crypt('secretOggdsf');
+
+## If you're running a publicly available site and allow anyone to
+## edit without requiring a password, you probably want to put some
+## blocklists in place to avoid wikispam.  See PmWiki.Blocklist.
+# $EnableBlocklist = 1;                    # enable manual blocklists
+# $EnableBlocklist = 10;                   # enable automatic blocklists
+
+##  PmWiki comes with graphical user interface buttons for editing;
+##  to enable these buttons, set $EnableGUIButtons to 1.  
+$EnableGUIButtons = 1;
+
+##  To enable markup syntax from the Creole common wiki markup language
+##  (http://www.wikicreole.org/), include it here:
+# include_once('scripts/creole.php');
+
+##  Some sites may want leading spaces on markup lines to indicate
+##  "preformatted text blocks", set $EnableWSPre=1 if you want to do
+##  this.  Setting it to a higher number increases the number of
+##  space characters required on a line to count as "preformatted text".
+# $EnableWSPre = 0;                        # PmWiki 2.2.0 default (disabled)
+# $EnableWSPre = 1;                        # lines beginning with space are preformatted
+# $EnableWSPre = 4;                        # lines with 4 spaces are preformatted
+
+##  If you want uploads enabled on your system, set $EnableUpload=1.
+##  You'll also need to set a default upload password, or else set
+##  passwords on individual groups and pages.  For more information
+##  see PmWiki.UploadsAdmin.
+$EnableUpload = 1;                       
+$DefaultPasswords['upload'] = crypt('secretOggdsf');
+
+##  Setting $EnableDiag turns on the ?action=diag and ?action=phpinfo
+##  actions, which often helps others to remotely troubleshoot 
+##  various configuration and execution problems.
+# $EnableDiag = 1;                         # enable remote diagnostics
+
+##  By default, PmWiki doesn't allow browsers to cache pages.  Setting
+##  $EnableIMSCaching=1; will re-enable browser caches in a somewhat
+##  smart manner.  Note that you may want to have caching disabled while
+##  adjusting configuration files or layout templates.
+# $EnableIMSCaching = 1;                   # allow browser caching
+
+##  Set $SpaceWikiWords if you want WikiWords to automatically 
+##  have spaces before each sequence of capital letters.
+# $SpaceWikiWords = 1;                     # turn on WikiWord spacing
+
+##  Set $EnableWikiWords if you want to allow WikiWord links.
+##  For more options with WikiWords, see scripts/wikiwords.php .
+$EnableWikiWords = 1;                      # enable WikiWord links
+
+##  $DiffKeepDays specifies the minimum number of days to keep a page's
+##  revision history.  The default is 3650 (approximately 10 years).
+# $DiffKeepDays=30;                        # keep page history at least 30 days
+
+## By default, viewers are prevented from seeing the existence
+## of read-protected pages in search results and page listings,
+## but this can be slow as PmWiki has to check the permissions
+## of each page.  Setting $EnablePageListProtect to zero will
+## speed things up considerably, but it will also mean that
+## viewers may learn of the existence of read-protected pages.
+## (It does not enable them to access the contents of the
+## pages.)
+# $EnablePageListProtect = 0;
+
+##  The refcount.php script enables ?action=refcount, which helps to
+##  find missing and orphaned pages.  See PmWiki.RefCount.
+# if ($action == 'refcount') include_once('scripts/refcount.php');
+
+##  The feeds.php script enables ?action=rss, ?action=atom, ?action=rdf,
+##  and ?action=dc, for generation of syndication feeds in various formats.
+# if ($action == 'rss') include_once('scripts/feeds.php');   # RSS 2.0
+# if ($action == 'atom') include_once('scripts/feeds.php');  # Atom 1.0
+# if ($action == 'dc') include_once('scripts/feeds.php');    # Dublin Core
+# if ($action == 'rdf') include_once('scripts/feeds.php');   # RSS 1.0
+
+##  In the 2.2.0-beta series, {$var} page variables are absolute by
+##  default, but a future version will make them relative.  This setting
+##  sets them out as relative to begin with.  (If you're starting a new
+##  site, it's probably best to leave this setting alone.)
+$EnableRelativePageVars = 1;
+
+##  By default, pages in the Category group are manually created.
+##  Uncomment the following line to have blank category pages
+##  automatically created whenever a link to a non-existent
+##  category page is saved.  (The page is created only if
+##  the author has edit permissions to the Category group.)
+# $AutoCreate['/^Category\\./'] = array('ctime' => $Now);
+
+##  PmWiki allows a great deal of flexibility for creating custom markup.
+##  To add support for '*bold*' and '~italic~' markup (the single quotes
+##  are part of the markup), uncomment the following lines. 
+##  (See PmWiki.CustomMarkup and the Cookbook for details and examples.)
+# Markup("'~", "inline", "/'~(.*?)~'/", "<i>$1</i>");        # '~italic~'
+# Markup("'*", "inline", "/'\\*(.*?)\\*'/", "<b>$1</b>");    # '*bold*'
+
+##  If you want to have to approve links to external sites before they
+##  are turned into links, uncomment the line below.  See PmWiki.UrlApprovals.
+##  Also, setting $UnapprovedLinkCountMax limits the number of unapproved
+##  links that are allowed in a page (useful to control wikispam).
+# include_once('scripts/urlapprove.php');
+# $UnapprovedLinkCountMax = 10;
+
+##  The following lines make additional editing buttons appear in the
+##  edit page for subheadings, lists, tables, etc.
+# $GUIButtons['h2'] = array(400, '\\n!! ', '\\n', '$[Heading]',
+#                     '$GUIButtonDirUrlFmt/h2.gif"$[Heading]"');
+# $GUIButtons['h3'] = array(402, '\\n!!! ', '\\n', '$[Subheading]',
+#                     '$GUIButtonDirUrlFmt/h3.gif"$[Subheading]"');
+# $GUIButtons['indent'] = array(500, '\\n->', '\\n', '$[Indented text]',
+#                     '$GUIButtonDirUrlFmt/indent.gif"$[Indented text]"');
+# $GUIButtons['outdent'] = array(510, '\\n-<', '\\n', '$[Hanging indent]',
+#                     '$GUIButtonDirUrlFmt/outdent.gif"$[Hanging indent]"');
+# $GUIButtons['ol'] = array(520, '\\n# ', '\\n', '$[Ordered list]',
+#                     '$GUIButtonDirUrlFmt/ol.gif"$[Ordered (numbered) list]"');
+# $GUIButtons['ul'] = array(530, '\\n* ', '\\n', '$[Unordered list]',
+#                     '$GUIButtonDirUrlFmt/ul.gif"$[Unordered (bullet) list]"');
+# $GUIButtons['hr'] = array(540, '\\n----\\n', '', '',
+#                     '$GUIButtonDirUrlFmt/hr.gif"$[Horizontal rule]"');
+# $GUIButtons['table'] = array(600,
+#                       '||border=1 width=80%\\n||!Hdr ||!Hdr ||!Hdr ||\\n||     ||     ||     ||\\n||     ||     ||     ||\\n', '', '', 
+#                     '$GUIButtonDirUrlFmt/table.gif"$[Table]"');
+

Added: trunk/oggdsf/website/orig/about_sdk.html
===================================================================
--- trunk/oggdsf/website/orig/about_sdk.html	                        (rev 0)
+++ trunk/oggdsf/website/orig/about_sdk.html	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,275 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+  <title>illiminable Ogg Directshow Filters for Speex, Vorbis, Theora and FLAC</title>
+  <meta name="description" content="Directshow Ogg demuxer/muxer with vorbis, speex, FLAC and theora decoders and encoders.">
+  <meta name="keywords" content="directshow, theora, vorbis, speex, ogg, media player, flac, codec, windows, audio, video, wmp, directX, plugin, plug-in, decoder, encoder, demux, mux, demuxer">
+</head>
+<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#DD0000" alink="#FF0000">
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#DDDDDD" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.xiph.org">Xiph.org</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.vorbis.com">Vorbis</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.speex.org">Speex</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.theora.org">Theora</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://flac.sourceforge.net/">FLAC</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.annodex.net">Annodex</a></DIV>
+</FONT>
+</TD>
+
+<TD width=10%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>ogg at illiminable.com</b></DIV>
+</FONT>
+</TD>
+
+</TR>
+
+
+</TABLE>
+</DIV>
+</FONT>
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><b><font size="+2">About Ogg SDK and oggcodecs Project</font></b></DIV>
+</FONT>
+</TD>
+</TR>
+
+</TABLE>
+</DIV>
+</FONT>
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#070707" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"></DIV>
+</FONT>
+</TD>
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+
+
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.illiminable.com/ogg/">Home</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV></DIV>
+</FONT>
+</TD>
+
+<TD width=10%><FONT size=2 color="#000000" face="Arial">
+<DIV></DIV>
+</FONT>
+</TD>
+
+
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/developers.html">Developer Info</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/history.html">History</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/docs/index.html">Documentation</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/about_sdk.html">About</a></DIV>
+</FONT>
+</TD>
+
+</TR>
+
+
+</TABLE>
+</DIV>
+</FONT>
+
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#070707" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"></DIV>
+</FONT>
+</TD>
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+
+
+
+
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Goals</b></DIV>
+</FONT>
+</TD>
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+The aim of this project is to provide the most complete implementation of the <a href="http://www.xiph.org/">xiph.org</a> codecs for Windows and Directshow. This includes decoders and encoders for all the xiph.org formats as well as <a href="http://www.annodex.net">annodex</a>. It is released under a BSD license, so they can be used by both open-source and commercial applications.
+
+<br>
+<br>
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Current State</b></DIV>
+</FONT>
+</TD>
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+Besides the directshow filters which many people are familiar with. The source distribution also contains many useful tools, for debugging and validating ogg files, which build on multiple platforms. There is also a .NET media player class which can basically provide an "instant" media player in any .NET application, as well as an early implementation of an apache2 module which can provide server side seeking (currently only of annodex files, but soon also ogg files)
+<br>
+<br>
+More information about the libraries and tools that are available in the source distribution can be found in the <a href="http://www.illiminable.com/ogg/developers.html">developers section</a>
+<br>
+<br>
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>In the pipeline</b></DIV>
+</FONT>
+</TD>
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+Many things are planned, I'm not committing solidly to anything! Though as at February 2006, you can expect to see a lot more development over the next few months, and hopefully for the rest of this year. We might get to 1.0 one of these years, with the goal being for the most complete, stable and user friendly solution for Xiph codecs on Windows.
+<br>
+<br>
+I was really busy last year and didn't get to do much, hopefully 2006 will see a much shorter release cycle.
+<br>
+<br>
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Contact me</b></DIV>
+</FONT>
+</TD>
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+<br>
+If you have questions, bug reports, feedback, suggestions, or want to tell me about your projects using oggcodecs you can contact me via email at ogg at illiminable.com . I try to answer all email, if you email me and I don't respond within 7 days I am not ignoring you, your email probably got lost amongst all the spam, or I've gone on holidays! In either case, if I don't respond, email me again. Please make your subjects meaningful, so they are easy to spot amongst the spam. Don't attach files to your first email to me, that increases the chance it will be marked as spam. If you have something you want to send me, tell me in your first email, and then once I respond I will tell you how to get the file to me, or I'll be expecting an attachment from you.
+<br>
+<br>
+You can also usually find me on IRC on Freenode servers (www.freenode.net) in #vorbis, #theora or #annodex. Remember I'm in Australia (GMT+8) so I'm more likely to respond in the afternoon/evening my time. My nick is illi.<br>
+<br>
+You could also try the xiph.org mailing lists, such as vorbis-dev.<br><br>
+Or if you want to see the svn commit information on the web, you can spy on me here with <a href="http://cia.navi.cx/stats/author/illiminable">CIA</a><br><br>
+
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#070707" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"></DIV>
+</FONT>
+</TD>
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+</body>
+</html>
+

Added: trunk/oggdsf/website/orig/developers.html
===================================================================
--- trunk/oggdsf/website/orig/developers.html	                        (rev 0)
+++ trunk/oggdsf/website/orig/developers.html	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,289 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+  <title>illiminable Ogg Directshow Filters for Speex, Vorbis, Theora and FLAC</title>
+  <meta name="description" content="Directshow Ogg demuxer/muxer with vorbis, speex, FLAC and theora decoders and encoders.">
+  <meta name="keywords" content="directshow, theora, vorbis, speex, ogg, media player, flac, codec, windows, audio, video, wmp, directX, plugin, plug-in, decoder, encoder, demux, mux, demuxer">
+</head>
+<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#DD0000" alink="#FF0000">
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#DDDDDD" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.xiph.org">Xiph.org</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.vorbis.com">Vorbis</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.speex.org">Speex</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.theora.org">Theora</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://flac.sourceforge.net/">FLAC</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.annodex.net">Annodex</a></DIV>
+</FONT>
+</TD>
+
+<TD width=10%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>ogg at illiminable.com</b></DIV>
+</FONT>
+</TD>
+
+</TR>
+
+
+</TABLE>
+</DIV>
+</FONT>
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><b><font size="+2">Developer information for Ogg SDK</font></b></DIV>
+</FONT>
+</TD>
+</TR>
+
+</TABLE>
+</DIV>
+</FONT>
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#070707" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"></DIV>
+</FONT>
+</TD>
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+
+
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.illiminable.com/ogg/">Home</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV></DIV>
+</FONT>
+</TD>
+
+<TD width=10%><FONT size=2 color="#000000" face="Arial">
+<DIV></DIV>
+</FONT>
+</TD>
+
+
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/developers.html">Developer Info</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/history.html">History</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/docs/index.html">Documentation</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/about_sdk.html">About SDK</a></DIV>
+</FONT>
+</TD>
+
+</TR>
+
+
+</TABLE>
+</DIV>
+</FONT>
+
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#070707" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"></DIV>
+</FONT>
+</TD>
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+
+
+
+
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Useful libraries in the SDK</b></DIV>
+</FONT>
+</TD>
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+<br>
+<br>
+
+With the exception of the .NET libraries, all those below will build on Windows, Mac OSX and Unix.
+
+<br>
+<b><FONT size=3 color="#000000" face="Arial">libOOOgg</FONT></b><br>
+libOOOgg is an independant implementation of the ogg encapsulation format. It provides a C++/OO set of classes for manipulating ogg pages and packets, and to paginator and packetise ogg files or streams. It provides similar functionality to libogg.
+<br>
+<br>
+
+<b><FONT size=3 color="#000000" face="Arial">libOOOggSeek</FONT></b><br>
+libOOOggSeek provides seektable based routines for seeking in ogg or annodex files, for rapid and efficient seeking as well as caching seektables for high performance low latency uses
+<br>
+<br>
+
+<b><FONT size=3 color="#000000" face="Arial">libTemporalURI</FONT></b><br>
+libTemporalURI provides parsing functions for the <a href="http://www.annodex.net/TR/draft-pfeiffer-temporal-fragments-02.html">temporal URI specification</a> which allows you to query media resources from a server by time offset in a URI. Also a .NET port of this library exists as libTemporalURIDotNET
+<br>
+<br>
+
+<b><FONT size=3 color="#000000" face="Arial">libDSPlayDotNET</FONT></b><br>
+libDSPlay is a library which provides media player functionality to .NET applications. It abstracts away all the directshow underpinnings and offers a simple API to control the media, which can be easily called from any .NET application. It provides all the most common media player functionality such as play, pause, stop, seek, volume, balance and even grabbing images from a playing video.
+<br>
+<br>
+
+<b><FONT size=3 color="#000000" face="Arial">libOggChef</FONT></b><br>
+libOggChef is a helper library for dynamically recomposing ogg and annodex files. It is still in early development. This is the core of the work done by the apache module (see below)
+<br>
+<br>
+
+<b><FONT size=3 color="#000000" face="Arial">mod_oggchef</FONT></b><br>
+mod_oggchef is an apache 2 module, which provides server side seeking via temporal URI's for ogg and annodex files. It is still in early development
+<br>
+<br>
+
+<b><FONT size=3 color="#000000" face="Arial">libCMMLTags</FONT></b><br>
+libCMMLTags is a container class library for manipulating <a href="http://www.annodex.net/TR/draft-pfeiffer-cmml-01.html">CMML V2.0</a> documents and elements. It is also available in a .NET library as libCMMLTagsDotNET
+<br>
+<br>
+
+<b><FONT size=3 color="#000000" face="Arial">libCMMLParse</FONT></b><br>
+libCMMLParse is a parsing library for CMML V2.0 It parses xml and generates the objects found in libCMMLTags. This is also available in a .NET version as libCMMLParseDotNET
+<br>
+<br>
+
+
+<b><FONT size=3 color="#000000" face="Arial">libDirectshowAbstracts</FONT></b><br>
+libDirectshowAbstracts provides several useful classes for creating directshow filters. All the directshow filters in oggcodecs use these.
+<br>
+<br>
+
+<b><FONT size=3 color="#000000" face="Arial">libVorbisComment</FONT></b><br>
+libVorbisComment is a parsing library for parsing and manipulating vorbis comment strings. It is also available as a .NET library as libVorbisCommentDotNet
+<br>
+<br>
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Useful tools in the SDK</b></DIV>
+</FONT>
+</TD>
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+<b><FONT size=3 color="#000000" face="Arial">OOOggDump</FONT></b><br>
+OOOggDump provides hex dumps of ogg files showing header data and packet sizes and breaks. It is useful for debugging problems that can occur in ogg files.
+<br>
+<br>
+
+<b><FONT size=3 color="#000000" face="Arial">OOOggValidate</FONT></b><br>
+OOOggValidate validates an ogg file structurally.
+<br>
+<br>
+
+
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#070707" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"></DIV>
+</FONT>
+</TD>
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+</body>
+</html>
+

Added: trunk/oggdsf/website/orig/downloads.html
===================================================================
--- trunk/oggdsf/website/orig/downloads.html	                        (rev 0)
+++ trunk/oggdsf/website/orig/downloads.html	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,274 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+  <title>illiminable Ogg Directshow Filters for Speex, Vorbis, Theora and FLAC</title>
+  <meta name="description" content="Directshow Ogg demuxer/muxer with vorbis, speex, FLAC and theora decoders and vorbis, speex encoders.">
+  <meta name="keywords" content="directshow, theora, vorbis, speex, ogg, media player, flac, codec, windows, audio, video, wmp, directX, plugin, plug-in, decoder, encoder, demux, mux, demuxer">
+</head>
+
+<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#DD0000" alink="#FF0000">
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#DDDDDD" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.xiph.org">Xiph.org</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.vorbis.com">Vorbis</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.speex.org">Speex</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.theora.org">Theora</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://flac.sourceforge.net/">FLAC</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.annodex.net">Annodex</a></DIV>
+</FONT>
+</TD>
+
+<TD width=10%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>ogg at illiminable.com</b></DIV>
+</FONT>
+</TD>
+
+</TR>
+
+
+</TABLE>
+</DIV>
+</FONT>
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><b><font size="+2">Download page for Directshow Filters for Ogg Vorbis, Speex, Theora and FLAC</font></b></DIV>
+</FONT>
+</TD>
+</TR>
+
+</TABLE>
+</DIV>
+</FONT>
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#070707" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"></DIV>
+</FONT>
+</TD>
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+<a href="http://www.illiminable.com/ogg">Main Page</a><br>
+<br>
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>About the downloads</b></DIV>
+</FONT>
+</TD>
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+From now on, there will be unstable releases made available. This allows me to keep one stable version for the average user and another version for those who like to keep up with that latest
+features, and are willing to live dangerously. This seems better than what recently has been long delays between releases. This is partly prompted by version 0.72.1838 which has a lot of new code
+and bufixes but which hasn't been thoroughly tested yet. At this stage I plan to keep a more regular unstable release, and possibly in the future a daily or very regular bleeding edge release.
+<br>
+<br>
+Unstable does not necessarily mean that it will crash more. It just means it hasn't been tested, so it may or may not be as stable as a proper release
+<br>
+<br>
+Additionally some major changes to add some new features and in particular to maintain 9X support while moving forward to full unicode support have caused the package size to increase quite dramatically
+from the 800-900k of the previous builds. At some point in the future, I will take some effort to trim this down again, and will also likely start offering two different releases. One with
+only the decoders which will be pretty small, and one with all the encoders and decoders and tools which will be slightly larger.
+<br>
+<br>
+As usual, please report bugs you find to me, being sure to tell me which version you are using.
+<br>
+<br>
+Current priorities - Better encoding support, vista support, tagging, shell integration, Windows Mobile 5 support.
+<br><br>
+<a href="#stable">Latest Stable (0.71.0946)</a><br>
+<a href="#unstable">Latest UNSTABLE (0.72.1838)</a><br>
+
+
+
+
+<a name="stable"></a>
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Current Stable Version (0.71.0946) - 24/02/2006</b></DIV>
+</FONT>
+</TD>
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+<br>
+More bugfixes, particularly to theora. See 0.70 release for more details about recent changes. Docs and source package will be updated on the weekend, there's no major changes there from 0.70. This version is fairly stable now it seems.
+<br>
+<br>
+
+<FONT size=2 color="#000000" face="Arial">
+<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
+
+<TR valign=top>
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows All Versions</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">824,901 bytes</div></DIV></FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_0.71.0946.exe">Download Now</a></div></DIV></FONT>
+</TD>
+</TR>
+
+
+
+</TABLE>
+</DIV>
+</FONT>
+<br>
+
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+<br>
+	<li>Fixed the theora seeking bug, should accurately seek to any frame without artefacts.</li>
+	<li>Fixed bug not handling WMP doing hardware video acceleration, caused crash on some files (Thanks slashdot!)</li>
+	<li>Fixed handling of missing 3xx http response codes</li>
+	<li>Fixed bug where player would crash if you dragged it from one monitor to another while playing</li>
+	<li>Fixed COM reference double-release bug</li>
+	<li>Fixed race condition which could crash or hang sometimes after a seek.</li>
+
+<br>
+<br>
+
+
+<a name="unstable"></a>
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Current UNSTABLE Version (0.72.1838) - 17/9/2006</b></DIV>
+</FONT>
+</TD>
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+<br>
+Major changes in this version include, updating all the code to Visual Studio 2005. There is now a "working" port for Windows Mobile 5.0 as at this revision, this is not yet released. Many minor bugixes and
+compatability fixes, dependancy updates, speed increases, unicode support, improved installer. Some major work was done to maintain Windows 9X/ME support while properly supporting unicode. If
+you use or have an interest in the maintaining of support for these obsolete operating systems, please let me know whether they are working for you.
+<br>
+<br>
+
+<FONT size=2 color="#000000" face="Arial">
+<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
+
+<TR valign=top>
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows All Versions</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">1,426,864 bytes</div></DIV></FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_0.72.1838.exe">Download Now</a></div></DIV></FONT>
+</TD>
+</TR>
+
+
+
+</TABLE>
+</DIV>
+</FONT>
+<br>
+
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+<br>
+	<li>Fixed bug that would refuse to play extremely small files</li>
+	<li>Added YUY2 output support to better support old graphics hardware</li>
+	<li>Updated speex to 1.2beta1</li>
+	<li>Updated project to VS 2005</li>
+	<li>Using theora-exp for theora decoding ~30% speed up</li>
+	<li>Improved 24/32 bit support for FLAC (still may not be perfect)</li>
+	<li>All code moved to unicode. Fixed bug which would fail if paths had unicode chars</li>
+	<li>Custom unicode emulating(unicows) CRT's to maintain Windows 9X support</li>
+	<li>Compatablity fixes for Media Portal and Media Player Classic</li>
+	<li>Installer detects and offers to remove previous versions</li>
+	<li>Installer offers to optionally associate WMP to .ogg</li>
+	<li>MMX optimisations for libtheora ported to MASM, encoding ~25-30% faster</li>
+	<li>Xiph fish icon in explorer</li>
+	<li>Code ported to Windows Mobile 5.0 (currently unreleased build)</li>
+	<li>Switch to integer decoding version of speex</li>
+
+
+
+<br>
+<br>
+
+
+<a href="http://www.illiminable.com/ogg">Main Page</a><br>
+<br>
+</body>
+</html>
+

Added: trunk/oggdsf/website/orig/enc_theora_graphedit.html
===================================================================
--- trunk/oggdsf/website/orig/enc_theora_graphedit.html	                        (rev 0)
+++ trunk/oggdsf/website/orig/enc_theora_graphedit.html	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,102 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+  <title>Encoding Ogg Vorbis + Theora files</title>
+  <meta name="description" content="Directshow Ogg demuxer/muxer with vorbis, speex, FLAC and theora decoders and vorbis, speex encoders.">
+  <meta name="keywords" content="directshow, theora, vorbis, speex, ogg, media player, flac, codec, windows, audio, video, wmp, directX, plugin, plug-in, 
+
+decoder, encoder, demux, mux, demuxer">
+</head>
+<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#FF00FF" alink="#FF0000">
+<a href="http://www.illiminable.com/ogg">Main Page</a><br><br>
+<b><u><font size="+2">How to encode theora files with directshow</font></u></b><br>
+If you have come to this page from an external site, please note before following these steps you need to install the <a href="http://www.illiminable.com/ogg/">directshow filters</a> on my main page.<br><br>
+This brief tutorial explains how to use the directshow filter in association with graphedit to encode or transcode ogg theora. It focuses mainly on transcoding, but by using different source filters you can also encode raw data.<br>
+Graphedit is available in the DirectX9 SDK<br>
+<br>
+
+<u><b>Step 1a - Load File</b></u><br>
+After loading up graphedit, from the file menu choose "Render Media File..." and browse to select the file you want to transcode<br>
+<br><img src="http://www.illiminable.com/ogg/images/select_render_file.JPG" alt="Select render file from the menu">
+<br>
+<br>
+
+<u><b>Step 1b - Rendered Graph</b></u><br>
+If it was successful, you should now have a fully rendered graph, that looks something like this. The exact filters will depends on your source file.<br>
+<br><img src="http://www.illiminable.com/ogg/images/show_rendered_graph.JPG" alt="This is the rendered graph">
+<br>
+<br>
+
+<u><b>Step 2a - Check media types</b></u><br>
+Right click on the pin that inputs to the video renderer, and choose pin properties.<br>
+<br><img src="http://www.illiminable.com/ogg/images/pin_properties.JPG" alt="Select pin proeprties">
+<br>
+<br>
+
+
+<u><b>Step 2b - Ensure YV12 or YUY2</b></u><br>
+On the pin properties page check the media type is either YV12 or YUY2, if it is not, this file can not yet be transcoded directly. If it is then proceed.<br>
+<br><img src="http://www.illiminable.com/ogg/images/ensure_YV12.JPG" alt="Select pin properties">
+<br>
+<br>
+
+
+<u><b>Step 3 - Remove renderers</b></u><br>
+This has rendered a graph for playback, what we want to do is remove the renderers from the graph, and replace them with our encoders and muxer. To remove the renderers click on them, they will get a blue border, then press the delete key. After removing the renderers, the graph should look something like this.<br>
+<br><img src="http://www.illiminable.com/ogg/images/remove_renderers.JPG" alt="This is the rendered graph">
+<br>
+<br>
+
+
+<u><b>Step 4 - Find encoders</b></u><br>
+The first time you will need to find the encoders, by clicking the add filter icon, then selecting the directshow branch of the tree.<br>
+<br><img src="http://www.illiminable.com/ogg/images/find_encoders.JPG" alt="Find the encoders">
+<br>
+<br>
+
+<u><b>Step 5a - Select encoders</b></u><br>
+Find the vorbis encode filter and the theora encode filter, select each one and check the favourite filter box so next time the filter will be under favourites in the menu, click insert filter.<br>
+<br><img src="http://www.illiminable.com/ogg/images/select_encoders.JPG" alt="Select the encoders">
+<br>
+<br>
+
+<u><b>Step 5b - Encoders Added to graph</b></u><br>
+After the encoders have been added to the graph, it should look something like this.<br>
+<br><img src="http://www.illiminable.com/ogg/images/encoders_added.JPG" alt="Graph after encoders added.">
+<br>
+<br>
+
+<u><b>Step 6 - Connect the encoders</b></u><br>
+By dragging the ouput pin of the decoder to the input of the encoder connect the filters together.<br>
+<br><img src="http://www.illiminable.com/ogg/images/connect_encoders.JPG" alt="Connecting encoder pins.">
+<br>
+<br>
+
+<u><b>Step 7 - Open the Theora Encoder Properties</b></u><br>
+Important: *BEFORE* connecting to the muxer, right click the filter and select it's proeprty page.<br>
+<br><img src="http://www.illiminable.com/ogg/images/filter_properties.JPG" alt="Selecting filter proeprties menu item.">
+<br>
+<br>
+
+<u><b>Step 8 - Setup the encoder properties</b></u><br>
+Modify the settings and click apply or ok. Future versions will include more comprehensive options<br>
+<br><img src="http://www.illiminable.com/ogg/images/theora_properties.JPG" alt="Select encoding parameters.">
+<br>
+<br>
+
+<u><b>Step 9 - Select Mux Filter</b></u><br>
+Select the Ogg Mux filter as you previously did for the encoders and connect the encoders to it. As you connect a pin a new one will be spawned.<br>
+Important: Whichever encoder is connected at *the bottom* is one that will appear *first* in the encoded file. <b>This means to make a valid theora file, the vorbis stream is added first to the top pin, then the theora stream to the next pin.</b><br>
+<br><img src="http://www.illiminable.com/ogg/images/select_muxer.JPG" alt="Select Muxer.">
+<br>
+<br>
+
+<u><b>Step 10 - Fully connected graph to play</b></u><br>
+The graph is now ready to go, and should look something like this. Press the play button and wait for the encoding to finish. It is finished when the play button goes green again. Close graphedit... don't press play again or it will overwrite the file. Depending on the source format it may show encoding progress in the progress bar, this is however slightly innacurate... the bar will appear to finish before the encoding has really finished. The progress bar indicates how much data has left the source. Look at the play button or check your processor to usage to see if it has finished.There will always be one empty pin at the bottom of the muxer, this is normal.<br>
+<br><img src="http://www.illiminable.com/ogg/images/fully_connected.JPG" alt="Fully Connected graph">
+<br>
+<br>
+<a href="http://www.illiminable.com/ogg">Main Page</a><br><br>
+
+</body>
+</html>
\ No newline at end of file

Added: trunk/oggdsf/website/orig/graphedit.html
===================================================================
--- trunk/oggdsf/website/orig/graphedit.html	                        (rev 0)
+++ trunk/oggdsf/website/orig/graphedit.html	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+  <title>illiminable Ogg Directshow Filters - graphedit encoding</title>
+  <meta name="description" content="Directshow Ogg demuxer/muxer with vorbis, speex, FLAC and theora decoders and vorbis, speex encoders.">
+  <meta name="keywords" content=" directshow, theora, vorbis, speex, ogg, media player, codec, audio, video, windows, wmp">
+</head>
+<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#FF00FF" alink="#FF0000">
+
+<a href="http://www.illiminable.com/ogg">Main Page</a><br><br>
+<b><u><font size="+2">Some sample encoding directshow graphs in graphedit</font></u></b><br>
+<br>
+
+<img src="http://www.illiminable.com/ogg/images/wave_to_vorbis_graphedit.JPG" alt="Wave to vorbis graph">
+<br>
+<b><u>Wave to vorbis encoding.</a></u> (Visit <a href="http://www.waixwave.com/index.php">WaixWave</a>)</b>
+<br>
+<br>
+
+<img src="http://www.illiminable.com/ogg/images/mp3_to_vorbis_graphedit.JPG" alt="MP3 to vorbis graph">
+<br>
+<b><u>MP3 to vorbis transcoding.</u></b>
+<br>
+<br>
+
+<img src="http://www.illiminable.com/ogg/images/ogg_split_graphedit.JPG" alt="Splitting multi-stream files graph">
+<br>
+<b><u>Splitting a theora+vorbis file to component parts.</u> (File : <a href="http://www.polycrystal.org/lego/movies.html">Lego Man Movies</a>)</b>
+<br>
+<br>
+
+<img src="http://www.illiminable.com/ogg/images/wma_to_vorbis_graphedit.JPG" alt="WMA to vorbis graph">
+<br>
+<b><u>WMA to vorbis transcoding.</u></b>
+<br>
+<br>
+
+<img src="http://www.illiminable.com/ogg/images/mp3_to_speex_graphedit.JPG" alt="MP3 to speex graph">
+<br>
+<b><u>MP3 to speex transcoding.</u></b>
+<br>
+<br>
+
+<img src="http://www.illiminable.com/ogg/images/vorbis_to_mp3_graphedit.JPG" alt="Vorbis to MP3 graph">
+<br>
+<b><u>Vorbis to MP3 transcoding.</u></b>
+<br>
+<br>
+<a href="http://www.illiminable.com/ogg">Main Page</a><br><br>
+
+</body>
+</html>
\ No newline at end of file

Added: trunk/oggdsf/website/orig/history.html
===================================================================
--- trunk/oggdsf/website/orig/history.html	                        (rev 0)
+++ trunk/oggdsf/website/orig/history.html	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,1343 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+  <title>illiminable Ogg Directshow Filters for Speex, Vorbis, Theora and FLAC</title>
+  <meta name="description" content="Directshow Ogg demuxer/muxer with vorbis, speex, FLAC and theora decoders and vorbis, speex encoders.">
+  <meta name="keywords" content="directshow, theora, vorbis, speex, ogg, media player, flac, codec, windows, audio, video, wmp, directX, plugin, plug-in, decoder, encoder, demux, mux, demuxer">
+</head>
+
+<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#DD0000" alink="#FF0000">
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#DDDDDD" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.xiph.org">Xiph.org</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.vorbis.com">Vorbis</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.speex.org">Speex</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.theora.org">Theora</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://flac.sourceforge.net/">FLAC</a></DIV>
+</FONT>
+</TD>
+
+<TD width=15%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><a href="http://www.annodex.net">Annodex</a></DIV>
+</FONT>
+</TD>
+
+<TD width=10%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>ogg at illiminable.com</b></DIV>
+</FONT>
+</TD>
+
+</TR>
+
+
+</TABLE>
+</DIV>
+</FONT>
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><b><font size="+2">History of Directshow Filters for Ogg Vorbis, Speex, Theora and FLAC</font></b></DIV>
+</FONT>
+</TD>
+</TR>
+
+</TABLE>
+</DIV>
+</FONT>
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#070707" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"></DIV>
+</FONT>
+</TD>
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+<a href="http://www.illiminable.com/ogg">Main Page</a><br>
+<br>
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>How it started...</b></DIV>
+</FONT>
+</TD>
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+I first began working on ogg media directshow filters whilst under contract to CSIRO's <a href="http://www.annodex.net">annodex.net</a> project group. Much of the knowledge I needed to write these filters was gained through my work with this project.My initial implementation was for a specific annodex (which uses the ogg encapsulation format)demuxer. Part of my aim of this project was to use the knowledge gained to create a set of filters that works with generic ogg physical streams rather than just a particular physical bitstream format and to release these back to the open source community. There were several limitations to the approach taken to the original annodex filters which is why I decided to start from scratch to design the filter architecture over again with the experience of the first attempt.<br>
+<br>
+Another of my aims of this project is to rewrite the annodex demuxer to use this new design in order for it to be more extensible and easier to work with. This time writing the generic ogg case first and then basing the annodex demuxer on this new design it will increase the consistency of the code between the two modules and provide less trouble integrating new codecs, with the aim of making annodex technology available in the standard applications that come default with windows.<br>
+<br>
+I encourage you all to go and check out the <a href="http://www.annodex.net">annodex project</a> and to consider coding some applications to utilise this new technology. There are many interesting posibilities this new technology presents to continuous media and search technology which will expand the internet to be a richer more dynamic multimedia experience.<br>
+<br>
+Thankyou to CSIRO's annodex.net project group (Silvia Pfeiffer, Conrad Parker and André Pang) for the opportunity to work on this exciting new technology and sparking my interest in directshow and the <a href="http://xiph.org">xiph.org</a> range of codecs.<br>
+<br>
+On the 1st of May 2004, this project began to be maintained in the <a href="http://www.xiph.org">xiph.org</a> subversion repository. It can be found at <a href="http://svn.xiph.org/trunk/oggdsf/">svn.xiph.org/trunk/oggdsf/</a><br>
+<br>
+<br>
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Versions</b></DIV>
+</FONT>
+</TD>
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+<b><font size="+1">Only download these if you have problems with the <a href="http://www.illiminable.com/ogg/">new version</a>.</font></b><br>
+<br>
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.70.0827) - 16/02/2006</b></DIV>
+</FONT>
+</TD>
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+<br>
+Wow... has it been a whole year :) Yes, this project is still alive! There's a fair bit of new code, so if you have problems you might want to try the <a href="http://www.illiminable.com/ogg/history.html">history</a> page and get version 0.69. One notable thing that this new version does not do correctly, is it no longer handles chained icecast streams, but it handles streaming static files on a server much better. The previous solution for icecast was a real hack which is no longer possible, it will be fixed properly fairly soon.
+<br>
+<br>
+I'm releasing now, because otherwise you'll be waiting forever! Releases should be coming much more frequently hopefully. As always, email me your bugs and feature requests. The unicode filenames will be fixed as soon as I can, sorry, I keep putting that one off.
+<br>
+<br>
+
+<FONT size=2 color="#000000" face="Arial">
+<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
+
+<TR valign=top>
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows All Versions</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">824,581 bytes</div></DIV></FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_0.70.0827.exe">Download Now</a></div></DIV></FONT>
+</TD>
+</TR>
+
+
+
+</TABLE>
+</DIV>
+</FONT>
+
+<b><u></u></b><br>
+	<li>Theora can seek without artefacts to any frame, even non-keyframes.(95% of the time, there's still a slight bug)</li>
+	<li>All seeking in all codecs is accurate to within a single audio sample (ie. sub-second)</li>
+	<li>Complete rewrite of demux, it's much easier for me to continue now.</li>
+	<li>OGM support is improved a bit, still not great. It does not associate with the .ogm extension to avoid messing with other solutions for .ogm you might have. But renaming the .ogm file to .ogg it will attempt to play it.</li>
+	<li>Improved handling of static files on servers (still not seeking over http)</li>
+	<li>Be aware that it builds a seektable for all on-disk files. For really large files (>250MB) it may take a little while for the file to load</li>
+	<li>Updated most libraries, vorbis is still at 1.1.1, speex still 1.1.10. Another release soonish may rectify this. I just want to release what I've got now, or it will keep being put off.</li>
+
+<br>
+<br>
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.69.8924) - 15/02/2005</b></DIV>
+</FONT>
+</TD>
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+<br>
+Lots of bufixes, especially memory leaks and memory management. Along with a new installer based on <a href="http://nsis.sourceforge.net/">NSIS</a>, which is just click-and-run.
+<br>
+<br>
+
+<FONT size=2 color="#000000" face="Arial">
+<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
+
+<TR valign=top>
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows All Versions</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">816,782 bytes</div></DIV></FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_0.69.8924.exe">Download Now</a></div></DIV></FONT>
+</TD>
+</TR>
+
+
+
+</TABLE>
+</DIV>
+</FONT>
+<br>
+
+
+<b><u></u></b><br>
+	<li>Removed several major memory leaks in encoders and decoders</li>
+	<li>More intelligent buffer sizing, reduces memory footprint about about 5-10 fold</li>
+	<li>Much more <a href="http://www.illiminable.com/ogg/docs/index.html">documentation</a></li>
+	<li>Vorbis encoder has programmatic interface for setting quality</li>
+	<li>Annodex Muxing support</li>
+	<li>Programmitic interface for encoding progress</li>
+	<li>Can seek in WMP6.4</li>
+	<li>Several other tools (not included in this binary) for server side seeking, and .NET media players added to <a href="http://www.illiminable.com/ogg/about_sdk.html">SDK</a></li>
+<br>
+<br>
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.68.8333) - 06/12/2004</b></DIV>
+</FONT>
+</TD>
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+<br>
+Mainly bugfixes.
+<br>
+<br>
+
+<FONT size=2 color="#000000" face="Arial">
+<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
+
+<TR valign=top>
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows XP</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">994,706 bytes</div></DIV></FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_XP_0.68.8333.zip">Download Now</a></div></DIV></FONT>
+</TD>
+</TR>
+
+
+
+<TR valign=top>
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows NT/2000</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">2,777,163 bytes</div></DIV></FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_2K_0.68.8333.zip">Download Now</a></div></DIV></FONT>
+</TD>
+</TR>
+
+
+
+
+<TR valign=top>
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows 98/ME</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">2,662,269 bytes</div></DIV></FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_9X_0.68.8333.zip">Download Now</a></div></DIV></FONT>
+</TD>
+</TR>
+
+</TABLE>
+</DIV>
+</FONT>
+<br>
+
+
+<b><u></u></b><br>
+	<li>Fixed playback from windows network drives.</li>
+	<li>Fixed bug where audio would stop if you seek really close to the end.</li>
+	<li>Seeking performance back to almost instant</li>
+<br>
+<br>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.67.8171) - 05/11/2004</b></DIV>
+</FONT>
+</TD>
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+<br>
+Added support for playing native flac files (.flac). No major bufixes in this release, I'm quite busy at the moment, but a new version which addresses many of 
+ the outstanding bugs will be ready in 2-3 weeks. Thanks for being patient.</br>
+<br>
+<br>
+
+<FONT size=2 color="#000000" face="Arial">
+<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
+
+<TR valign=top>
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows XP</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">969,047 bytes</div></DIV></FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_XP_0.67.8171.zip">Download Now</a></div></DIV></FONT>
+</TD>
+</TR>
+
+
+
+<TR valign=top>
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows NT/2000</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">2,751,504 bytes</div></DIV></FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_2K_0.67.8171.zip">Download Now</a></div></DIV></FONT>
+</TD>
+</TR>
+
+
+
+
+<TR valign=top>
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows 98/ME</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">2,636,610 bytes</div></DIV></FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_9X_0.67.8171.zip">Download Now</a></div></DIV></FONT>
+</TD>
+</TR>
+
+</TABLE>
+</DIV>
+</FONT>
+<br>
+
+<b><u></u></b><br>
+	<li>Now supports native FLAC (.flac files) without ogg container.</li>
+<br>
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.66.8063) - 21/10/2004</b></DIV>
+</FONT>
+</TD>
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+<br>
+Added support for the new Ogg FLAC format and fixed that Explorer problem with locked files. A fair bit of internal shuffling, but mainly a whole lot of memory leaks have been eliminated.<br>
+<br>
+<br>
+
+<FONT size=2 color="#000000" face="Arial">
+<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
+
+<TR valign=top>
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows XP</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">952,518 bytes</div></DIV></FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_XP_0.66.8063.zip">Download Now</a></div></DIV></FONT>
+</TD>
+</TR>
+
+
+
+<TR valign=top>
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows NT/2000</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">2,734,975 bytes</div></DIV></FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_2K_0.66.8063.zip">Download Now</a></div></DIV></FONT>
+</TD>
+</TR>
+
+
+
+
+<TR valign=top>
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows 98/ME</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">2,620,081 bytes</div></DIV></FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_9X_0.66.8063.zip">Download Now</a></div></DIV></FONT>
+</TD>
+</TR>
+
+</TABLE>
+</DIV>
+</FONT>
+<br>
+
+<b><u></u></b><br>
+	<li>FLAC can now be muxed into a multi-stream file.</li>
+	<li>Now supports both the new Ogg FLAC (1.1.1) and the old Ogg FLAC (still not native FLAC)</li>
+	<li>Fixed the explorer problem by removing the offending registry key at installation</li>
+	<li>Removed a heap of memory leaks, WMP should run a fair bit leaner now</li>
+	<li>Some internal changes to the queueing mechanism</li>
+	<li>There's some skeleton <a href="http://www.illiminable.com/ogg/docs/index.html">API documentation</a> for developers. It's pretty sparse on info still though.</li>
+<br>
+<br>
+
+
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.65.7923) - 07/10/2004</b></DIV>
+</FONT>
+</TD>
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+<br>
+Added support for icecast vorbis streams. Works for most streams, though there is a limitation that the stream can't change codebooks, or audio settings mid-stream, but 
+this shouldn't be a problem for most streams. Also an internal fix on the format blocks of the filters. To use icecast streams in WMP you need paste the url in to the 
+Open Url dialog box (File->Open URL...). WMP doesn't support .pls files... so if this is what form the stream takes, for now, you need to save the .pls file, and copy-paste 
+the link that is inside it into WMP.
+
+
+<br>
+<br>
+Most of the major functionality bugs are sorted out now, I'm quite happy with this release and the previous one, though still a way to go.
+<br>
+<br>
+<FONT size=2 color="#000000" face="Arial">
+<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
+
+<TR valign=top>
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows XP</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">938,166 bytes</div></DIV></FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_XP_0.65.7923.zip">Download Now</a></div></DIV></FONT>
+</TD>
+</TR>
+
+
+
+<TR valign=top>
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows NT/2000</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">2,720,623 bytes</div></DIV></FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_2K_0.65.7923.zip">Download Now</a></div></DIV></FONT>
+</TD>
+</TR>
+
+
+
+
+<TR valign=top>
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows 98/ME</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">2,605,729 bytes</div></DIV></FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_9X_0.65.7923.zip">Download Now</a></div></DIV></FONT>
+</TD>
+</TR>
+
+</TABLE>
+</DIV>
+</FONT>
+<br>
+
+
+<b><u></u></b><br>
+	<li>Can now play most vorbis icecast streams.</li>
+	<li>Fixed some random values in the format blocks (Thanks to Robert Huitl for reporting this.)</li>
+<br>
+<br>
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#BBBBBB" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.64.7878) - 25/09/2004</b></DIV>
+</FONT>
+</TD>
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+<br>
+Fixed up the seeking in WMP 9 and 10 mainly... and a few other fixes. Also added more colour space conversions for the encoder.
+<br>
+<br>
+<br>
+<FONT size=2 color="#000000" face="Arial">
+<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows XP</DIV>
+</FONT>
+</TD>
+
+
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">948,458 bytes</div></DIV></FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_XP_0.64.7878.zip">Download Now</a></div></DIV></FONT>
+</TD>
+
+</TR>
+
+
+
+<TR valign=top>
+
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows NT/2000</DIV>
+</FONT>
+</TD>
+
+
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">2,730,915 bytes</div></DIV></FONT>
+</TD>
+
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_2K_0.64.7878.zip">Download Now</a></div></DIV></FONT>
+</TD>
+
+</TR>
+
+
+
+
+<TR valign=top>
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows 98/ME</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">2,616,021 bytes</div></DIV></FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_9X_0.64.7878.zip">Download Now</a></div></DIV></FONT>
+</TD>
+</TR>
+
+</TABLE>
+</DIV>
+</FONT>
+<br>
+
+
+<b><u></u></b><br>
+	<li>Fixed seeking in WMP 9 and 10.</li>
+	<li>Fixed a bug using the WMP activeX control.</li>
+	<li>Theora encoder accepts new media types ie RGB24, RGB32, AYUV, IYUV, UYVY, YVYU... only RGB32 has been tested, as i don't have any source of the other types.</li>
+<br>
+<br>
+
+
+
+
+
+
+
+
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.63.7755) - 13/09/2004</b></DIV>
+</FONT>
+</TD>
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+<br>
+I put the installers back in the packages. Just makes it easier for people who aren't computer savvy. Also theora now plays in WMP9 and 10 (but still can't seek in these two players). 
+Also fixed a bug in the speex encoder that made a mess of theora+speex files. Fixed a few more memory leaks.<br>
+<br>
+<br>
+<FONT size=2 color="#000000" face="Arial">
+<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows XP</DIV>
+</FONT>
+</TD>
+
+
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">950,311 bytes</div></DIV></FONT>
+</TD>
+
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_XP_0.63.7755.zip">Download Now</a></div></DIV></FONT>
+</TD>
+
+</TR>
+
+
+
+<TR valign=top>
+
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows NT/2000</DIV>
+</FONT>
+</TD>
+
+
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">2,732,768 bytes</div></DIV></FONT>
+</TD>
+
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_2K_0.63.7755.zip">Download Now</a></div></DIV></FONT>
+</TD>
+
+</TR>
+
+
+
+
+<TR valign=top>
+
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows 98/ME</DIV>
+</FONT>
+</TD>
+
+
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">2,617,874 bytes</div></DIV></FONT>
+</TD>
+
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_9X_0.63.7755.zip">Download Now</a></div></DIV></FONT>
+</TD>
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+<br>
+
+
+<b><u></u></b><br>
+	<li>Fixed a few memory leaks... there are still more left though.</li>
+	<li>Fixed some bugs in speex encoder. Can now make proper speex+theora files</li>
+	<li>Theora playback works in WMP 9 and 10 now... but no seeking in these two players</li>
+	<li>Fixed a muxing problem with large packets.</li>
+	<li>Increased some of the buffer sizes. Trying to encode very high quality theora was crashing as the buffer was too small</li>
+<br>
+<br>
+
+
+
+
+
+
+
+
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.62.7673) - 01/09/2004</b></DIV>
+</FONT>
+</TD>
+
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+To stop people unnecessarily downloading the windows installer over and over, the packages will no longer include the installer. If you have a pre-XP 
+windows, and don't already have the windows installer on your system (almost everyone who has ever installed something should have it already) you can
+download the installer seperately from the links at the top of the page.<br>
+<br>
+Fixed the network streaming, and removed all the .NET sample apps from this release. <a href="http://www.illiminable.com/ogg/sse_builds.html">Experimental SSE/SSE2 builds can be found here</a><br>
+Changed the installer a bit so people realise when they download via download "shell sites", which hide the true source of the download, where it came from and where to look for updates.<br>
+<br>
+<FONT size=2 color="#000000" face="Arial">
+<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows 98/ME/NT/2K/XP</DIV>
+</FONT>
+</TD>
+
+
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">942,859 bytes</div></DIV></FONT>
+</TD>
+
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_0.62.7673.zip">Download Now</a></div></DIV></FONT>
+</TD>
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+<br>
+	<li>Fixed a few memory leaks... there are still more left though.</li>
+	<li>Removed all the .NET sample applications to avoid those without .NET being forced to install it.</li>
+	<li>Streaming greatly improved. Will now cache a file as it streams in the TEMP directory as specified in environment variables.</li>
+	<li>Made experimental SSE/SSE2 optimised builds of all libraries.</li>
+	<li>Changed the installer so that you have to click through the BSD licenses, and to show where the software came from as many sites are linking directly to the .zip files so users are not getting the opportunity to read about known issues, or even know if they are getting the current version.</li>
+<br>
+
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.61.7571) - 16/08/2004</b></DIV>
+</FONT>
+</TD>
+
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+
+
+To stop people unnecessarily downloading the windows installer over and over, the packages will no longer include the installer. If you have a pre-XP 
+windows, and don't already have the windows installer on your system (almost everyone who has ever installed something should have it already) you can
+download the installer seperately from the links at the top of the page.<br>
+<br>
+Fixed a few bugs in theora, seeking almost never crashes now. FLAC playback and seeking now works properly, though not extensively tested. Includes a FLAC encoder filter. Starting from the
+next release I will start offering different build configurations, ie minimal decode only installation, builds with SSE2 optimisations etc.<br>
+<br>
+
+
+
+<FONT size=2 color="#000000" face="Arial">
+<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+<TD width=40%><FONT size=2 color="#000000" face="Arial">
+<DIV>Ogg Codecs for windows</DIV>
+</FONT>
+</TD>
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV>Windows 98/ME/NT/2K/XP</DIV>
+</FONT>
+</TD>
+
+
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right">1,076,031 bytes</div></DIV></FONT>
+</TD>
+
+<TD width=20%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_0.61.7571.zip">Download Now</a></div></DIV></FONT>
+</TD>
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+<br>
+
+	<li>Fixed seeking crash problems with theora</li>
+	<li>Fixed FLAC playback</li>
+	<li>Added a FLAC encoder filter</li>
+	<li>Added a very simple .NET media player called DNPlay</li>
+	<li>Added a .NET directshow playback library</li>
+	<li>Added a validation program for ogg files OOOggValidate</li>
+<br>
+
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.60.7043) - 08/07/2004</b></DIV>
+</FONT>
+</TD>
+
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+
+Quite a fair bit added this time, most notably an encoder for theora... see <a href="http://www.illiminable.com/ogg/enc_theora_graphedit.html">Encoding theora</a><br>
+Only a few encoding parameters are currently exposed via a filter property page. Also modified the demuxer so it can handle http streams though there are some issues. The buffering is very simple, it doesn't optimise buffer based on bandwidth. Network steams are currently non-seekable. Also only non-chained
+files should be streamed. Most encoded files are not chained. However some icecast streams, Which are not continuous, have breaks where songs change, this type of stream will likely crash the media player. However continuous live streams... such as radio broadcasts etc generally work fine. The network streaming has only recently be added, so i expect it to still be fairly buggy.<br>
+<br>
+To all the people interested in FLAC, I will be spending some time sorting out the bugs that have been there for ages very soon, thanks for your patience !<br>
+<br>
+This release has a lot of new code added, I'd really appreciate feedback on the installation process, and the encoding. I will leave the links to the previous version up for a while further down the page.<br>
+
+<br>
+	<li>Added <a href="http://www.annodex.net/TR/draft-pfeiffer-cmml-01.html">CMML</a> Decoder filter</li>
+	<li>Added a simple subtitle renderer based on VMR 9</li>
+	<li>Added an OO vorbis comment parsing library</li>
+	<li>Added an example tool called OOOggCommentDump which dumps comment information from the first stream in a file</li>
+	<li>Added container class library for <a href="http://www.annodex.net/TR/draft-pfeiffer-cmml-01.html">CMML</a></li>
+	<li>Added minimal <a href="http://www.annodex.net/TR/draft-pfeiffer-cmml-01.html">CMML</a> parsing library based on MSXML</a>
+	<li>Added a demuxer filter for <a href="http://www.annodex.net/">Annodex</a>, will only play in graphedit currently, and needs to manually build graphs to include the VMR9 as video renderer, also won't play the mpeg coded videos that are on the annodex site.</li>
+	<li>Added network support for demuxer to stream .ogg files</li>
+	<li>Fixed the speex encoder (I think)</li>
+	<li>Ogg Mux filter now supports multiple stream muxing</li>
+	<li>Added a theora encode filter, with a minimal configurable property page</li>
+	<li>Theora encode filter supports YUY2 input (generally from mpeg) or YV12 (generally from avi codecs, in particular those decoded by ffdshow)</li>
+	<li>Fixed some bad implementation of frame offsets in the theora decoder</li>
+	<li>Now files can be added to the WMP9+ Media Library, however no media metadata is yet extracted from the vorbis comments. Nor can you currently use the rip or burn functionality.</li>
+
+<br>
+<br>
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.57.6744) - 22/05/2004</b></DIV>
+</FONT>
+</TD>
+
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+Previous release a few hours ago had hundreds of debug statements in the release build. It may have created log files in your C:\ Root directory as well as C:\temp and possibly in G:\ if you have a writable G drive. Sorry if you got this a few hours ago.
+<br>
+	<li>Removed a whole heap of debugging code.</li>
+	<li>See 0.56.6741 release below for latest changes.</li>
+
+<br>
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.56.6741) - 21/05/2004</b></DIV>
+</FONT>
+</TD>
+
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+Most of the changes in this build are internal modifications to better deal with the need to determine start times of all samples in order to properly synchronise multi-stream files. The main externally visible change is the limited ability to seek in theora files without total loss of synch. There are still a few issues to be ironed out though.
+<br>
+	<li>Modified internal timestamping mechanism, to allow resynch easier in theora.</li>
+	<li>Now able to seek in theora (not to keyframe), but occasionally crashes after seek.</li>
+	<li>Speex and vorbis, don't have seg fault any more, though very rarely after a seek there is no audio. Another seek fixes it.</li>
+	<li>Added simple new tool called OOOggStat, to give info on contained streams.</li>
+
+<br>
+
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.55.0115) - 27/04/2004</b></DIV>
+</FONT>
+</TD>
+
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+
+Vorbis and speex playback are now pretty much finished bar the very rare bug I mention below. I've played dozens of speex and vorbis files and they all seem just fine. Pretty much fully functional.<br>
+The track duration shows up incorrectly in all codecs besides speex and vorbis because I haven't coded it yet !<br>
+A seek table is built as the file is loaded... this is currently done by basicly processing the entire file... so there may be a small delay loading large files. When I get time I'll replace this with a better method that doesn't try and process the entire file, but can skip through to the relevant parts.<br>
+	<li>NOTE: I suggest you don't distribute files encoded with these codecs yet... there may still be problems with them</li>
+	<li>Fixed clumpy playback of divx, bad timestamping</li>
+	<li>Added seeking, duration and position info to vorbis and speex</li>
+	<li>Fixed a few internal errors with regards to timestamping</li>
+	<li>Added a seek table for rapid seeking</li>
+<br>
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+
+
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.52.0093) - 18/04/2004</b></DIV>
+</FONT>
+</TD>
+
+
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+
+	<li>NOTE: I suggest you don't distribute files encoded with these codecs yet... there may still be problems with them</li>
+	<li>See version 0.50.0090 for information</li>
+	<li>Now checksums pages properly.</li>
+	<li>Properly organises initial header packets in pages.</li>
+	
+
+<br>
+
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.51.0092) - 18/04/2004</b></DIV>
+</FONT>
+</TD>
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+	<li>See version 0.50.0090 for information</li>
+	<li>Stuffed up some packaging and linking in the last version... probably won't affect it, but just to be safe, did rebuild and package. Sorry if you got it 5 minutes ago !</li>
+	
+<br>
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.50.0090) - 18/04/2004</b></DIV>
+</FONT>
+</TD>
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+Start of encoding support has been added... see <a href="http://www.illiminable.com/ogg/graphedit.html">example filter graphs</a>. Use graphedit (<a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9216652f-51e0-402e-b7b5-feb68d00f298&displaylang=en">DirectX9 SDK</a>)</li>
+	<li>Added support for OGM style video encapsulation *decode only*, requires <a href="http://sourceforge.net/projects/ffdshow">ffdshow</a>. Should recognise any format ffdshow can handle. (Video quite clumpy at the moment)</li>
+	<li>Added single stream Ogg Muxer... for muxing theora, speex and vorbis</li>
+	<li>Added vorbis encoder filter</li>
+	<li>Added speex encoder filter</li>
+	<li>Included Abstract Audio Encoder library</li>
+	
+<br>
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.40.0069) - 08/04/2004</b></DIV>
+</FONT>
+</TD>
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+
+
+This new release completes the basic functionality for the four major codecs, though there are still bugs. Theora hasn't been extensively tested
+as I don't have many test files to work with. FLAC is still pretty buggy... theora less so... but still buggy.
+	<li>NOTE: Untested with DirectX 8 or lower. I'm pretty sure theora will only play with DX9. Others *should* work with DX8.</li>
+	<li>Added basic Theora support (alpha 3 *only*, previous bitstream formats are depracated). See issues below.</li>
+	<li>Included OO Theora wrapper library</li>
+	<li>Included Abstract Video Decoder library</li>
+<br>
+<br>
+
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.30.0058) - 31/03/2004</b></DIV>
+</FONT>
+</TD>
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+
+Just thought I'd release this update. It includes some FLAC support but it's very buggy, I suggest you don't use FLAC just yet.<br>
+Vorbis and speex are the same as before but with below changes. Vorbis and Speex won't crash<br>
+	<li>Fixed bug in stream recogniser which defaulted unknown to speex.</li>
+	<li>Fixed minor defect in audio when stopping and replaying</li>
+	<li>Split Vorbis and Speex to seperate filters</li>
+	<li>Included Abstract Codec Library</li>
+	<li>Now ignores unknown streams. ie. Playing a theora/vorbis will only play the vorbis</li>
+	<li>Major abstractions to demux filter in preperation for theora/annodex</li>
+	<li>Included very basic Ogg FLAC playback (very buggy, see below, update in a day or two to fix)</li>
+	<li>Included one of my basic debugging tools. OOOggDump. Usage : OOOggDump filename, be sure to redirect output to a file</li>
+<br>
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.22.0035) - 24/03/2004</b></DIV>
+</FONT>
+</TD>
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+	<li>Updated libfishsound to 0.6.0</li>
+	<li>Changes to attribution text files.</li>
+	<li>Release builds with compiler optimisations.</li>
+<br>
+<br>
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.21.0032) - 24/03/2004</b></DIV>
+</FONT>
+</TD>
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+	<li>Fixed audio defects.</li>
+	<li>Added clipping to account for out of range floats from vorbis</li>
+	<li>Updated vorbis to 1.0.1 and speex to 1.0.3</li><br>
+<br>
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.20.0022) - 23/03/2004</b></DIV>
+</FONT>
+</TD>
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+	<li>Added support for speex.</li>
+	<li>Recognises speex files with .ogg .spx or .speex extensions</li><br>
+<br>
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.11.0020) - 22/03/2004</b></DIV>
+</FONT>
+</TD>
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+
+	<li>Removed several memory leaks.</li>
+	<li>Media Player doesn't make the error sound on exiting any more.</li>
+	<li>Fixed a few crashing bugs that only show up in graphedit by doing stupid things.</li>
+	<li>Package is more compressed now.</li>
+	<li>Fixed a crashing bug in libfishsound</li><br>
+<br>
+
+
+
+<FONT size=2 color="#101010" face="Arial">
+<DIV><TABLE width=100% bgcolor="#CCCCCC" border=0 cellpadding=2 cellspacing=2>
+<TR valign=top>
+<TD width=100%><FONT size=2 color="#000000" face="Arial">
+<DIV><div align="left"><b>Previous Version (0.10.0019) - 22/03/2004</b></DIV>
+</FONT>
+</TD>
+</TR>
+</TABLE>
+</DIV>
+</FONT>
+
+	<li>Initial binary release.</li><br>
+<br>
+<a href="http://www.illiminable.com/ogg">Main Page</a><br>
+<br>
+</body>
+</html>
+

Added: trunk/oggdsf/website/pmwiki.php
===================================================================
--- trunk/oggdsf/website/pmwiki.php	                        (rev 0)
+++ trunk/oggdsf/website/pmwiki.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,2037 @@
+<?php
+/*
+    PmWiki
+    Copyright 2001-2007 Patrick R. Michaud
+    pmichaud at pobox.com
+    http://www.pmichaud.com/
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+    ----
+    Note from Pm:  Trying to understand the PmWiki code?  Wish it had 
+    more comments?  If you want help with any of the code here,
+    write me at <pmichaud at pobox.com> with your question(s) and I'll
+    provide explanations (and add comments) that answer them.
+*/
+error_reporting(E_ALL ^ E_NOTICE);
+StopWatch('PmWiki');
+ at ini_set('magic_quotes_runtime', 0);
+ at ini_set('magic_quotes_sybase', 0);
+if (@ini_get('pcre.backtrack_limit') < 1000000) 
+  @ini_set('pcre.backtrack_limit', 1000000);
+if (ini_get('register_globals')) 
+  foreach($_REQUEST as $k=>$v) { 
+    if (preg_match('/^(GLOBALS|_SERVER|_GET|_POST|_COOKIE|_FILES|_ENV|_REQUEST|_SESSION|FarmD|WikiDir)$/i', $k)) exit();
+    ${$k}=''; unset(${$k}); 
+  }
+$UnsafeGlobals = array_keys($GLOBALS); $GCount=0; $FmtV=array();
+SDV($FarmD,dirname(__FILE__));
+SDV($WorkDir,'wiki.d');
+define('PmWiki',1);
+if (preg_match('/\\w\\w:/', $FarmD)) exit();
+ at include_once("$FarmD/scripts/version.php");
+$GroupPattern = '[[:upper:]][\\w]*(?:-\\w+)*';
+$NamePattern = '[[:upper:]\\d][\\w]*(?:-\\w+)*';
+$BlockPattern = 'form|div|table|t[rdh]|p|[uo]l|d[ltd]|h[1-6r]|pre|blockquote';
+$WikiWordPattern = '[[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*';
+$WikiDir = new PageStore('wiki.d/{$FullName}');
+$WikiLibDirs = array(&$WikiDir,new PageStore('$FarmD/wikilib.d/{$FullName}'));
+$LocalDir = 'local';
+$InterMapFiles = array("$FarmD/scripts/intermap.txt",
+  "$FarmD/local/farmmap.txt", '$SiteGroup.InterMap', 'local/localmap.txt');
+$Newline = "\263";                                 # deprecated, 2.0.0
+$KeepToken = "\235\235";  
+$Now=time();
+define('READPAGE_CURRENT', $Now+604800);
+$TimeFmt = '%B %d, %Y, at %I:%M %p';
+$TimeISOFmt = '%Y-%m-%dT%H:%M:%S';
+$TimeISOZFmt = '%Y-%m-%dT%H:%M:%SZ';
+$MessagesFmt = array();
+$BlockMessageFmt = "<h3 class='wikimessage'>$[This post has been blocked by the administrator]</h3>";
+$EditFields = array('text');
+$EditFunctions = array('EditTemplate', 'RestorePage', 'ReplaceOnSave',
+  'SaveAttributes', 'PostPage', 'PostRecentChanges', 'AutoCreateTargets',
+  'PreviewPage');
+$EnablePost = 1;
+$ChangeSummary = substr(preg_replace('/[\\x00-\\x1f]|=\\]/', '', 
+                                     stripmagic(@$_REQUEST['csum'])), 0, 100);
+$AsSpacedFunction = 'AsSpaced';
+$SpaceWikiWords = 0;
+$RCDelimPattern = '  ';
+$RecentChangesFmt = array(
+  '$SiteGroup.AllRecentChanges' => 
+    '* [[{$Group}.{$Name}]]  . . . $CurrentTime $[by] $AuthorLink: [=$ChangeSummary=]',
+  '$Group.RecentChanges' =>
+    '* [[{$Group}/{$Name}]]  . . . $CurrentTime $[by] $AuthorLink: [=$ChangeSummary=]');
+$UrlScheme = (@$_SERVER['HTTPS']=='on' || @$_SERVER['SERVER_PORT']==443)
+             ? 'https' : 'http';
+$ScriptUrl = $UrlScheme.'://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'];
+$PubDirUrl = preg_replace('#/[^/]*$#', '/pub', $ScriptUrl, 1);
+$HTMLVSpace = "<vspace>";
+$HTMLPNewline = '';
+$MarkupFrame = array();
+$MarkupFrameBase = array('cs' => array(), 'vs' => '', 'ref' => 0,
+  'closeall' => array(), 'is' => array(),
+  'escape' => 1);
+$WikiWordCountMax = 1000000;
+$WikiWordCount['PmWiki'] = 1;
+$TableRowIndexMax = 1;
+$UrlExcludeChars = '<>"{}|\\\\^`()[\\]\'';
+$QueryFragPattern = "[?#][^\\s$UrlExcludeChars]*";
+$SuffixPattern = '(?:-?[[:alnum:]]+)*';
+$LinkPageSelfFmt = "<a class='selflink' href='\$LinkUrl'>\$LinkText</a>";
+$LinkPageExistsFmt = "<a class='wikilink' href='\$LinkUrl'>\$LinkText</a>";
+$LinkPageCreateFmt = 
+  "<a class='createlinktext' rel='nofollow' 
+    href='{\$PageUrl}?action=edit'>\$LinkText</a><a rel='nofollow' 
+    class='createlink' href='{\$PageUrl}?action=edit'>?</a>";
+$UrlLinkFmt = 
+  "<a class='urllink' href='\$LinkUrl' rel='nofollow'>\$LinkText</a>";
+umask(002);
+$CookiePrefix = '';
+$SiteGroup = 'Site';
+$SiteAdminGroup = 'SiteAdmin';
+$DefaultGroup = 'Main';
+$DefaultName = 'HomePage';
+$GroupHeaderFmt = '(:include {$Group}.GroupHeader self=0 basepage={*$FullName}:)(:nl:)';
+$GroupFooterFmt = '(:nl:)(:include {$Group}.GroupFooter self=0 basepage={*$FullName}:)';
+$PagePathFmt = array('{$Group}.$1','$1.$1','$1.{$DefaultName}');
+$PageAttributes = array(
+  'passwdread' => '$[Set new read password:]',
+  'passwdedit' => '$[Set new edit password:]',
+  'passwdattr' => '$[Set new attribute password:]');
+$XLLangs = array('en');
+if (preg_match('/^C$|\.UTF-?8/i',setlocale(LC_ALL,0)))
+  setlocale(LC_ALL,'en_US');
+$FmtP = array();
+$FmtPV = array(
+  # '$ScriptUrl'    => 'PUE($ScriptUrl)',   ## $ScriptUrl is special
+  '$PageUrl'      => 
+    'PUE(($EnablePathInfo) 
+         ? "$ScriptUrl/$group/$name"
+         : "$ScriptUrl?n=$group.$name")',
+  '$FullName'     => '"$group.$name"',
+  '$Groupspaced'  => '$AsSpacedFunction($group)',
+  '$Namespaced'   => '$AsSpacedFunction($name)',
+  '$Group'        => '$group',
+  '$Name'         => '$name',
+  '$Titlespaced'  => 
+    '@$page["title"] ? $page["title"] : $AsSpacedFunction($name)',
+  '$Title'        => 
+    '@$page["title"] ? $page["title"] : ($GLOBALS["SpaceWikiWords"]
+       ? $AsSpacedFunction($name) : $name)',
+  '$LastModifiedBy' => '@$page["author"]',
+  '$LastModifiedHost' => '@$page["host"]',
+  '$LastModified' => 'strftime($GLOBALS["TimeFmt"], $page["time"])',
+  '$LastModifiedSummary' => '@$page["csum"]',
+  '$Description' => '@$page["description"]',
+  '$SiteGroup'    => '$GLOBALS["SiteGroup"]',
+  '$VersionNum'   => '$GLOBALS["VersionNum"]',
+  '$Version'      => '$GLOBALS["Version"]',
+  '$Author'       => 'NoCache($GLOBALS["Author"])',
+  '$AuthId'       => 'NoCache($GLOBALS["AuthId"])',
+  '$DefaultGroup' => '$GLOBALS["DefaultGroup"]',
+  '$DefaultName'  => '$GLOBALS["DefaultName"]',
+  '$BaseName'     => 'MakeBaseName($pn)',
+  '$Action'       => '$GLOBALS["action"]',
+  '$PasswdRead'   => 'PasswdVar($pn, "read")',
+  '$PasswdEdit'   => 'PasswdVar($pn, "edit")',
+  '$PasswdAttr'   => 'PasswdVar($pn, "attr")',
+  );
+$SaveProperties = array('title', 'description', 'keywords');
+$PageTextVarPatterns = array(
+  'var:'        => '/^(:*\\s*(\\w[-\\w]*)\\s*:[ \\t]?)(.*)($)/m',
+  '(:var:...:)' => '/(\\(: *(\\w[-\\w]*) *:(?!\\))\\s?)(.*?)(:\\))/s'
+  );
+
+
+$WikiTitle = 'PmWiki';
+$Charset = 'ISO-8859-1';
+$HTTPHeaders = array(
+  "Expires: Tue, 01 Jan 2002 00:00:00 GMT",
+  "Cache-Control: no-store, no-cache, must-revalidate",
+  "Content-type: text/html; charset=ISO-8859-1;");
+$CacheActions = array('browse','diff','print');
+$EnableHTMLCache = 0;
+$NoHTMLCache = 0;
+$HTMLDoctypeFmt = 
+  "<!DOCTYPE html 
+    PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"
+    \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
+  <html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'><head>\n";
+$HTMLStylesFmt['pmwiki'] = "
+  ul, ol, pre, dl, p { margin-top:0px; margin-bottom:0px; }
+  code.escaped { white-space: nowrap; }
+  .vspace { margin-top:1.33em; }
+  .indent { margin-left:40px; }
+  .outdent { margin-left:40px; text-indent:-40px; }
+  a.createlinktext { text-decoration:none; border-bottom:1px dotted gray; }
+  a.createlink { text-decoration:none; position:relative; top:-0.5em;
+    font-weight:bold; font-size:smaller; border-bottom:none; }
+  img { border:0px; }
+  ";
+$HTMLHeaderFmt['styles'] = array(
+  "<style type='text/css'><!--",&$HTMLStylesFmt,"\n--></style>");
+$HTMLBodyFmt = "</head>\n<body>";
+$HTMLStartFmt = array('headers:',&$HTMLDoctypeFmt,&$HTMLHeaderFmt,
+  &$HTMLBodyFmt);
+$HTMLEndFmt = "\n</body>\n</html>";
+$PageStartFmt = array(&$HTMLStartFmt,"\n<div id='contents'>\n");
+$PageEndFmt = array('</div>',&$HTMLEndFmt);
+
+$HandleActions = array(
+  'browse' => 'HandleBrowse', 'print' => 'HandleBrowse',
+  'edit' => 'HandleEdit', 'source' => 'HandleSource', 
+  'attr' => 'HandleAttr', 'postattr' => 'HandlePostAttr',
+  'logout' => 'HandleLogoutA', 'login' => 'HandleLoginA');
+$HandleAuth = array(
+  'browse' => 'read', 'source' => 'read', 'print' => 'read',
+  'edit' => 'edit', 'attr' => 'attr', 'postattr' => 'attr',
+  'logout' => 'read', 'login' => 'login');
+$ActionTitleFmt = array(
+  'edit' => '| $[Edit]',
+  'attr' => '| $[Attributes]');
+$DefaultPasswords = array('admin'=>'*','read'=>'','edit'=>'','attr'=>'');
+$AuthCascade = array('edit'=>'read', 'attr'=>'edit');
+$AuthList = array('' => 1, 'nopass:' => 1, '@nopass' => 1);
+
+$Conditions['enabled'] = '(boolean)@$GLOBALS[$condparm]';
+$Conditions['false'] = 'false';
+$Conditions['true'] = 'true';
+$Conditions['group'] = 
+  "(boolean)MatchPageNames(\$pagename, FixGlob(\$condparm, '$1$2.*'))";
+$Conditions['name'] = 
+  "(boolean)MatchPageNames(\$pagename, FixGlob(\$condparm, '$1*.$2'))";
+$Conditions['match'] = 'preg_match("!$condparm!",$pagename)';
+$Conditions['authid'] = 'NoCache(@$GLOBALS["AuthId"] > "")';
+$Conditions['exists'] = 'PageExists(MakePageName(\$pagename, \$condparm))';
+$Conditions['equal'] = 'CompareArgs($condparm) == 0';
+function CompareArgs($arg) 
+  { $arg = ParseArgs($arg); return strcmp(@$arg[''][0], @$arg[''][1]); }
+
+$Conditions['auth'] = 'NoCache(CondAuth($pagename, $condparm))';
+function CondAuth($pagename, $condparm) {
+  @list($level, $pn) = explode(' ', $condparm, 2);
+  $pn = ($pn > '') ? MakePageName($pagename, $pn) : $pagename;
+  return (boolean)RetrieveAuthPage($pn, $level, false, READPAGE_CURRENT);
+}
+
+## CondExpr handles complex conditions (expressions)
+## Portions Copyright 2005 by D. Faure (dfaure at cpan.org)
+function CondExpr($pagename, $condname, $condparm) {
+  global $CondExprOps;
+  SDV($CondExprOps, 'and|x?or|&&|\\|\\||[!()]');
+  if ($condname == '(' || $condname == '[')
+    $condparm = preg_replace('/[\\]\\)]\\s*$/', '', $condparm);
+  $condparm = str_replace('&amp;&amp;', '&&', $condparm);
+  $terms = preg_split("/(?<!\\S)($CondExprOps)(?!\\S)/i", $condparm, -1,
+                      PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
+  foreach($terms as $i => $t) {
+    $t = trim($t);
+    if (preg_match("/^($CondExprOps)$/i", $t)) continue;
+    if ($t) $terms[$i] = CondText($pagename, "if $t", 'TRUE') ? '1' : '0';
+  }
+  return @eval('return(' . implode(' ', $terms) . ');');
+}
+$Conditions['expr'] = 'CondExpr($pagename, $condname, $condparm)';
+$Conditions['('] = 'CondExpr($pagename, $condname, $condparm)';
+$Conditions['['] = 'CondExpr($pagename, $condname, $condparm)';
+
+$MarkupTable['_begin']['seq'] = 'B';
+$MarkupTable['_end']['seq'] = 'E';
+Markup('fulltext','>_begin');
+Markup('split','>fulltext',"\n",
+  '$RedoMarkupLine=1; return explode("\n",$x);');
+Markup('directives','>split');
+Markup('inline','>directives');
+Markup('links','>inline');
+Markup('block','>links');
+Markup('style','>block');
+Markup('closeall', '_begin',
+  '/^\\(:closeall:\\)$/e', 
+  "'<:block>' . MarkupClose()");
+
+$ImgExtPattern="\\.(?:gif|jpg|jpeg|png|GIF|JPG|JPEG|PNG)";
+$ImgTagFmt="<img src='\$LinkUrl' alt='\$LinkAlt' title='\$LinkAlt' />";
+
+$BlockMarkups = array(
+  'block' => array('','','',0),
+  'ul' => array('<ul><li>','</li><li>','</li></ul>',1),
+  'dl' => array('<dl>','</dd>','</dd></dl>',1),
+  'ol' => array('<ol><li>','</li><li>','</li></ol>',1),
+  'p' => array('<p>','','</p>',0),
+  'indent' => 
+     array("<div class='indent'>","</div><div class='indent'>",'</div>',1),
+  'outdent' => 
+     array("<div class='outdent'>","</div><div class='outdent'>",'</div>',1),
+  'pre' => array('<pre>','','</pre>',0),
+  'table' => array("<table width='100%'>",'','</table>',0));
+
+foreach(array('http:','https:','mailto:','ftp:','news:','gopher:','nap:',
+    'file:') as $m) 
+  { $LinkFunctions[$m] = 'LinkIMap';  $IMap[$m]="$m$1"; }
+$LinkFunctions['<:page>'] = 'LinkPage';
+
+$q = preg_replace('/(\\?|%3f)([-\\w]+=)/', '&$2', @$_SERVER['QUERY_STRING']);
+if ($q != @$_SERVER['QUERY_STRING']) {
+  unset($_GET);
+  parse_str($q, $_GET);
+  $_REQUEST = array_merge($_REQUEST, $_GET, $_POST);
+}
+
+if (isset($_GET['action'])) $action = $_GET['action'];
+elseif (isset($_POST['action'])) $action = $_POST['action'];
+else $action = 'browse';
+
+$pagename = @$_REQUEST['n'];
+if (!$pagename) $pagename = @$_REQUEST['pagename'];
+if (!$pagename && 
+    preg_match('!^'.preg_quote($_SERVER['SCRIPT_NAME'],'!').'/?([^?]*)!',
+      $_SERVER['REQUEST_URI'],$match))
+  $pagename = urldecode($match[1]);
+if (preg_match('/[\\x80-\\xbf]/',$pagename)) 
+  $pagename=utf8_decode($pagename);
+$pagename = preg_replace('![^[:alnum:]\\x80-\\xff]+$!','',$pagename);
+$FmtPV['$RequestedPage'] = "'".htmlspecialchars($pagename, ENT_QUOTES)."'";
+$Cursor['*'] = &$pagename;
+
+if (file_exists("$FarmD/local/farmconfig.php")) 
+  include_once("$FarmD/local/farmconfig.php");
+if (IsEnabled($EnableLocalConfig,1)) {
+  if (file_exists("$LocalDir/config.php")) 
+    include_once("$LocalDir/config.php");
+  elseif (file_exists('config.php'))
+    include_once('config.php');
+}
+
+SDV($CurrentTime, strftime($TimeFmt, $Now));
+SDV($CurrentTimeISO, strftime($TimeISOFmt, $Now));
+
+if (IsEnabled($EnableStdConfig,1))
+  include_once("$FarmD/scripts/stdconfig.php");
+
+foreach((array)$InterMapFiles as $f) {
+  $f = FmtPageName($f, $pagename);
+  if (($v = @file($f))) 
+    $v = preg_replace('/^\\s*(?>\\w[-\\w]*)(?!:)/m', '$0:', implode('', $v));
+  else if (PageExists($f)) {
+    $p = ReadPage($f, READPAGE_CURRENT);
+    $v = $p['text'];
+  } else continue;
+  if (!preg_match_all("/^\\s*(\\w[-\\w]*:)[^\\S\n]+(\\S*)/m", $v, 
+                      $match, PREG_SET_ORDER)) continue;
+  foreach($match as $m) {
+    if (strpos($m[2], '$1') === false) $m[2] .= '$1';
+    $LinkFunctions[$m[1]] = 'LinkIMap';
+    $IMap[$m[1]] = FmtPageName($m[2], $pagename);
+  }
+}
+
+$LinkPattern = implode('|',array_keys($LinkFunctions));
+SDV($LinkPageCreateSpaceFmt,$LinkPageCreateFmt);
+
+$keys = array_keys($AuthCascade);
+while ($keys) {
+  $k = array_shift($keys); $t = $AuthCascade[$k];
+  if (in_array($t, $keys)) 
+    { unset($AuthCascade[$k]); $AuthCascade[$k] = $t; array_push($keys, $k); }
+}
+
+$ActionTitle = FmtPageName(@$ActionTitleFmt[$action], $pagename);
+if (!@$HandleActions[$action] || !function_exists($HandleActions[$action])) 
+  $action='browse';
+if (IsEnabled($EnableActions, 1)) HandleDispatch($pagename, $action);
+Lock(0);
+return;
+
+##  HandleDispatch() is used to dispatch control to the appropriate
+##  action handler with the appropriate permissions.
+##  If a message is supplied, it is added to $MessagesFmt.
+function HandleDispatch($pagename, $action, $msg=NULL) {
+  global $MessagesFmt, $HandleActions, $HandleAuth;
+  if ($msg) $MessagesFmt[] = "<div class='wikimessage'>$msg</div>";
+  $fn = $HandleActions[$action];
+  $auth = $HandleAuth[$action];
+  if (!$auth) $auth = 'read';
+  return $fn($pagename, $auth);
+}
+
+## helper functions
+function stripmagic($x) 
+  { return get_magic_quotes_gpc() ? stripslashes($x) : $x; }
+function pre_r(&$x)
+  { return '<pre>'.htmlspecialchars(print_r($x, true)).'</pre>'; }
+function PSS($x) 
+  { return str_replace('\\"','"',$x); }
+function PVS($x) 
+  { return preg_replace("/\n[^\\S\n]*(?=\n)/", "\n<:vspace>", $x); }
+function PVSE($x) { return PVS(htmlspecialchars($x, ENT_NOQUOTES)); }
+function PZZ($x,$y='') { return ''; }
+function PRR($x=NULL) 
+  { if ($x || is_null($x)) $GLOBALS['RedoMarkupLine']++; return $x; }
+function PUE($x)
+  { return preg_replace('/[\\x80-\\xff \'"]/e', "'%'.dechex(ord('$0'))", $x); }
+function PQA($x) { 
+  $out = '';
+  if (preg_match_all('/([a-zA-Z]+)\\s*=\\s*("[^"]*"|\'[^\']*\'|\\S*)/',
+                     $x, $attr, PREG_SET_ORDER)) {
+    foreach($attr as $a) {
+      if (preg_match('/^on/i', $a[1])) continue;
+      $out .= $a[1] . '=' 
+              . preg_replace( '/^(?![\'"]).*$/e', 
+                  "\"'\".str_replace(\"'\", '&#39;', PSS('$0')).\"'\"", $a[2])
+              . ' ';
+    }
+  }
+  return $out;
+}
+function SDV(&$v,$x) { if (!isset($v)) $v=$x; }
+function SDVA(&$var,$val) 
+  { foreach($val as $k=>$v) if (!isset($var[$k])) $var[$k]=$v; }
+function IsEnabled(&$var,$f=0)
+  { return (isset($var)) ? $var : $f; }
+function SetTmplDisplay($var, $val) 
+  { NoCache(); $GLOBALS['TmplDisplay'][$var] = $val; }
+function NoCache($x = '') { $GLOBALS['NoHTMLCache'] |= 1; return $x; }
+function ParseArgs($x, $optpat = '(?>(\\w+)[:=])') {
+  $z = array();
+  preg_match_all("/($optpat|[-+])?(\"[^\"]*\"|'[^']*'|\\S+)/",
+    $x, $terms, PREG_SET_ORDER);
+  foreach($terms as $t) {
+    $v = preg_replace('/^([\'"])?(.*)\\1$/', '$2', $t[3]);
+    if ($t[2]) { $z['#'][] = $t[2]; $z[$t[2]] = $v; }
+    else { $z['#'][] = $t[1]; $z[$t[1]][] = $v; }
+    $z['#'][] = $v;
+  }
+  return $z;
+}
+function StopWatch($x) { 
+  global $StopWatch, $EnableStopWatch;
+  if (!$EnableStopWatch) return;
+  static $wstart = 0, $ustart = 0;
+  list($usec,$sec) = explode(' ',microtime());
+  $wtime = ($sec+$usec); 
+  if (!$wstart) $wstart = $wtime;
+  if ($EnableStopWatch != 2) 
+    { $StopWatch[] = sprintf("%05.2f %s", $wtime-$wstart, $x); return; }
+  $dat = getrusage();
+  $utime = ($dat['ru_utime.tv_sec']+$dat['ru_utime.tv_usec']/1000000);
+  if (!$ustart) $ustart=$utime;
+  $StopWatch[] = 
+    sprintf("%05.2f %05.2f %s", $wtime-$wstart, $utime-$ustart, $x);
+}
+
+
+## DRange converts a variety of string formats into date (ranges).
+## It returns the start and end timestamps (+1 second) of the specified date.
+function DRange($when) {
+  global $Now;
+  ##  unix/posix @timestamp dates
+  if (preg_match('/^\\s*@(\\d+)\\s*(.*)$/', $when, $m)) {
+    $t0 = $m[2] ? strtotime($m[2], $m[1]) : $m[1];
+    return array($t0, $t0+1);
+  }
+  ##  ISO-8601 dates
+  $dpat = '/
+    (?<!\\d)                 # non-digit
+    (19\\d\\d|20[0-3]\\d)    # year ($1)
+    ([-.\\/]?)               # date separator ($2)
+    (0\\d|1[0-2])            # month ($3)
+    (?: \\2                  # repeat date separator
+      ([0-2]\\d|3[0-1])      # day ($4)
+      (?: T                  # time marker
+        ([01]\\d|2[0-4])     # hour ($5)
+        ([.:]?)              # time separator ($6)
+        ([0-5]\\d)           # minute ($7)
+        (?: \\6              # repeat time separator
+          ([0-5]\\d|60)      # seconds ($8)
+        )?                   # optional :ss
+      )?                     # optional Thh:mm:ss
+    )?                       # optional -ddThh:mm:ss
+    (?!\d)                   # non-digit
+    /x';
+  if (preg_match($dpat, $when, $m)) {
+    $n = $m;
+    ##  if no day given, assume 1st of month and full month range
+    if (@$m[4] == '') { $m[4] = 1; $n[4] = 1; $n[3]++; }
+    ##  if no time given, assume range of 1 day
+    if (@$m[5] == '') { @$n[4]++; }
+    ##  if no seconds given, assume range of 1 minute
+    if (@$m[8] == '') { @$n[7]++; }
+    $t0 = @mktime($m[5], $m[7], $m[8], $m[3], $m[4], $m[1]);
+    $t1 = @mktime($n[5], $n[7], $n[8], $n[3], $n[4], $n[1]);
+    return array($t0, $t1);
+  }
+  ##  now, today, tomorrow, yesterday
+  NoCache();
+  if ($when == 'now') return array($Now, $Now+1);
+  $m = localtime(time());
+  if ($when == 'tomorrow') { $m[3]++; $when = 'today'; }
+  if ($when == 'yesterday') { $m[3]--; $when = 'today'; }
+  if ($when == 'today') 
+    return array(mktime(0, 0, 0, $m[4]+1, $m[3]  , $m[5]+1900),
+                 mktime(0, 0, 0, $m[4]+1, $m[3]+1, $m[5]+1900));
+  if (preg_match('/^\\s*$/', $when)) return array(-1, -1);
+  $t0 = strtotime($when);
+  $t1 = strtotime("+1 day", $t0);
+  return array($t0, $t1);
+}
+
+## AsSpaced converts a string with WikiWords into a spaced version
+## of that string.  (It can be overridden via $AsSpacedFunction.)
+function AsSpaced($text) {
+  $text = preg_replace("/([[:lower:]\\d])([[:upper:]])/", '$1 $2', $text);
+  $text = preg_replace('/([^-\\d])(\\d[-\\d]*( |$))/','$1 $2',$text);
+  return preg_replace("/([[:upper:]])([[:upper:]][[:lower:]\\d])/",
+    '$1 $2', $text);
+}
+
+## Lock is used to make sure only one instance of PmWiki is running when
+## files are being written.  It does not "lock pages" for editing.
+function Lock($op) { 
+  global $WorkDir, $LockFile, $EnableReadOnly;
+  if ($op > 0 && IsEnabled($EnableReadOnly, 0))
+    Abort('Cannot modify site -- $EnableReadOnly is set', 'readonly');
+  SDV($LockFile, "$WorkDir/.flock");
+  mkdirp(dirname($LockFile));
+  static $lockfp,$curop;
+  if (!$lockfp) $lockfp = @fopen($LockFile, "w");
+  if (!$lockfp) { 
+    if ($op <= 0) return;
+    @unlink($LockFile); 
+    $lockfp = fopen($LockFile,"w") or
+      Abort('Cannot acquire lockfile', 'flock');
+    fixperms($LockFile);
+  }
+  if ($op<0) { flock($lockfp,LOCK_UN); fclose($lockfp); $lockfp=0; $curop=0; }
+  elseif ($op==0) { flock($lockfp,LOCK_UN); $curop=0; }
+  elseif ($op==1 && $curop<1) 
+    { session_write_close(); flock($lockfp,LOCK_SH); $curop=1; }
+  elseif ($op==2 && $curop<2) 
+    { session_write_close(); flock($lockfp,LOCK_EX); $curop=2; }
+}
+
+## mkdirp creates a directory and its parents as needed, and sets
+## permissions accordingly.
+function mkdirp($dir) {
+  global $ScriptUrl;
+  if (file_exists($dir)) return;
+  if (!file_exists(dirname($dir))) mkdirp(dirname($dir));
+  if (mkdir($dir, 0777)) {
+    fixperms($dir);
+    if (@touch("$dir/xxx")) { unlink("$dir/xxx"); return; }
+    rmdir($dir);
+  }
+  $parent = realpath(dirname($dir)); 
+  $perms = decoct(fileperms($parent) & 03777);
+  $msg = "PmWiki needs to have a writable <tt>$dir/</tt> directory 
+    before it can continue.  You can create the directory manually 
+    by executing the following commands on your server:
+    <pre>    mkdir $parent/$dir\n    chmod 777 $parent/$dir</pre>
+    Then, <a href='{$ScriptUrl}'>reload this page</a>.";
+  $safemode = ini_get('safe_mode');
+  if (!$safemode) $msg .= "<br /><br />Or, for a slightly more 
+    secure installation, try executing <pre>    chmod 2777 $parent</pre> 
+    on your server and following <a target='_blank' href='$ScriptUrl'>
+    this link</a>.  Afterwards you can restore the permissions to 
+    their current setting by executing <pre>    chmod $perms $parent</pre>.";
+  Abort($msg);
+}
+
+## fixperms attempts to correct permissions on a file or directory
+## so that both PmWiki and the account (current dir) owner can manipulate it
+function fixperms($fname, $add = 0) {
+  clearstatcache();
+  if (!file_exists($fname)) Abort('?no such file');
+  $bp = 0;
+  if (fileowner($fname)!=@fileowner('.')) $bp = (is_dir($fname)) ? 007 : 006;
+  if (filegroup($fname)==@filegroup('.')) $bp <<= 3;
+  $bp |= $add;
+  if ($bp && (fileperms($fname) & $bp) != $bp)
+    @chmod($fname,fileperms($fname)|$bp);
+}
+
+## GlobToPCRE converts wildcard patterns into pcre patterns for
+## inclusion and exclusion.  Wildcards beginning with '-' or '!'
+## are treated as things to be excluded.
+function GlobToPCRE($pat) {
+  $pat = preg_quote($pat, '/');
+  $pat = str_replace(array('\\*', '\\?', '\\[', '\\]', '\\^'),
+                     array('.*',  '.',   '[',   ']',   '^'), $pat);
+  $excl = array(); $incl = array();
+  foreach(preg_split('/,+\s?/', $pat, -1, PREG_SPLIT_NO_EMPTY) as $p) {
+    if ($p{0} == '-' || $p{0} == '!') $excl[] = '^'.substr($p, 1).'$';
+    else $incl[] = "^$p$";
+  }
+  return array(implode('|', $incl), implode('|', $excl));
+}
+
+## FixGlob changes wildcard patterns without '.' to things like
+## '*.foo' (name matches) or 'foo.*' (group matches).
+function FixGlob($x, $rep = '$1*.$2') {
+  return preg_replace('/([\\s,][-!]?)([^\\/.\\s,]+)(?=[\\s,])/', $rep, ",$x,");
+}
+
+## MatchPageNames reduces $pagelist to those pages with names
+## matching the pattern(s) in $pat.  Patterns can be either
+## regexes to include ('/'), regexes to exclude ('!'), or
+## wildcard patterns (all others).
+function MatchPageNames($pagelist, $pat) {
+  $pagelist = (array)$pagelist;
+  foreach((array)$pat as $p) {
+    if (count($pagelist) < 1) break;
+    if (!$p) continue;
+    switch ($p{0}) {
+      case '/': 
+        $pagelist = preg_grep($p, $pagelist); 
+        continue;
+      case '!':
+        $pagelist = array_diff($pagelist, preg_grep($p, $pagelist)); 
+        continue;
+      default:
+        list($inclp, $exclp) = GlobToPCRE(str_replace('/', '.', $p));
+        if ($exclp) 
+          $pagelist = array_diff($pagelist, preg_grep("/$exclp/i", $pagelist));
+        if ($inclp)
+          $pagelist = preg_grep("/$inclp/i", $pagelist);
+    }
+  }
+  return $pagelist;
+}
+  
+## ResolvePageName "normalizes" a pagename based on the current
+## settings of $DefaultPage and $PagePathFmt.  It's normally used
+## during initialization to fix up any missing or partial pagenames.
+function ResolvePageName($pagename) {
+  global $DefaultPage, $DefaultGroup, $DefaultName,
+    $GroupPattern, $NamePattern, $EnableFixedUrlRedirect;
+  SDV($DefaultPage, "$DefaultGroup.$DefaultName");
+  $pagename = preg_replace('!([./][^./]+)\\.html$!', '$1', $pagename);
+  if ($pagename == '') return $DefaultPage;
+  $p = MakePageName($DefaultPage, $pagename);
+  if (!preg_match("/^($GroupPattern)[.\\/]($NamePattern)$/i", $p)) {
+    header('HTTP/1.1 404 Not Found');
+    Abort('$[?invalid page name]');
+  }
+  if (preg_match("/^($GroupPattern)[.\\/]($NamePattern)$/i", $pagename))
+    return $p;
+  if (IsEnabled($EnableFixedUrlRedirect, 1)
+      && $p && (PageExists($p) || preg_match('/[\\/.]/', $pagename)))
+    { Redirect($p); exit(); }
+  return MakePageName($DefaultPage, "$pagename.$pagename");
+}
+
+## MakePageName is used to convert a string $str into a fully-qualified
+## pagename.  If $str doesn't contain a group qualifier, then 
+## MakePageName uses $basepage and $PagePathFmt to determine the 
+## group of the returned pagename.
+function MakePageName($basepage, $str) {
+  global $MakePageNameFunction, $PageNameChars, $PagePathFmt,
+    $MakePageNamePatterns;
+  if (@$MakePageNameFunction) return $MakePageNameFunction($basepage, $str);
+  SDV($PageNameChars,'-[:alnum:]');
+  SDV($MakePageNamePatterns, array(
+    "/'/" => '',			   # strip single-quotes
+    "/[^$PageNameChars]+/" => ' ',         # convert everything else to space
+    '/((^|[^-\\w])\\w)/e' => "strtoupper('$1')",
+    '/ /' => ''));
+  $str = preg_replace('/[#?].*$/', '', $str);
+  $m = preg_split('/[.\\/]/', $str);
+  if (count($m)<1 || count($m)>2 || $m[0]=='') return '';
+  ##  handle "Group.Name" conversions
+  if (@$m[1] > '') {
+    $group = preg_replace(array_keys($MakePageNamePatterns),
+               array_values($MakePageNamePatterns), $m[0]);
+    $name = preg_replace(array_keys($MakePageNamePatterns),
+              array_values($MakePageNamePatterns), $m[1]);
+    return "$group.$name";
+  }
+  $name = preg_replace(array_keys($MakePageNamePatterns),
+            array_values($MakePageNamePatterns), $m[0]);
+  $isgrouphome = count($m) > 1;
+  foreach((array)$PagePathFmt as $pg) {
+    if ($isgrouphome && strncmp($pg, '$1.', 3) !== 0) continue;
+    $pn = FmtPageName(str_replace('$1', $name, $pg), $basepage);
+    if (PageExists($pn)) return $pn;
+  }
+  if ($isgrouphome) {
+    foreach((array)$PagePathFmt as $pg) 
+      if (strncmp($pg, '$1.', 3) == 0)
+        return FmtPageName(str_replace('$1', $name, $pg), $basepage);
+    return "$name.$name";
+  }
+  return preg_replace('/[^\\/.]+$/', $name, $basepage);
+}
+
+
+## MakeBaseName uses $BaseNamePatterns to return the "base" form
+## of a given pagename -- i.e., stripping any recipe-defined
+## prefixes or suffixes from the page.
+function MakeBaseName($pagename, $patlist = NULL) {
+  global $BaseNamePatterns;
+  if (is_null($patlist)) $patlist = (array)@$BaseNamePatterns;
+  foreach($patlist as $pat => $rep) 
+    $pagename = preg_replace($pat, $rep, $pagename);
+  return $pagename;
+}
+
+
+## PCache caches basic information about a page and its attributes--
+## usually everything except page text and page history.  This makes
+## for quicker access to certain values in PageVar below.
+function PCache($pagename, $page) {
+  global $PCache;
+  foreach($page as $k=>$v) 
+    if ($k!='text' && strpos($k,':')===false) $PCache[$pagename][$k]=$v;
+}
+
+## SetProperty saves a page property into $PCache.  For convenience
+## it returns the $value of the property just set.  If $sep is supplied,
+## then $value is appended to the current property (with $sep as
+## as separator) instead of replacing it.
+function SetProperty($pagename, $prop, $value, $sep = NULL) {
+  global $PCache, $KeepToken;
+  NoCache();
+  $prop = "=p_$prop";
+  $value = preg_replace("/$KeepToken(\\d.*?)$KeepToken/e", 
+                        "\$GLOBALS['KPV']['$1']", $value);
+  if (!is_null($sep) && isset($PCache[$pagename][$prop]))
+    $value = $PCache[$pagename][$prop] . $sep . $value;
+  $PCache[$pagename][$prop] = $value;
+  return $value;
+}
+
+
+## PageTextVar loads a page's text variables (defined by
+## $PageTextVarPatterns) into a page's $PCache entry, and returns
+## the property associated with $var.
+function PageTextVar($pagename, $var) {
+  global $PCache, $PageTextVarPatterns;
+  if (!@$PCache[$pagename]['=pagetextvars']) {
+    $pc = &$PCache[$pagename];
+    $pc['=pagetextvars'] = 1;
+    $page = RetrieveAuthPage($pagename, 'read', false, READPAGE_CURRENT);
+    if ($page) {
+      foreach((array)$PageTextVarPatterns as $pat) 
+        if (preg_match_all($pat, @$page['text'], $match, PREG_SET_ORDER))
+          foreach($match as $m) {
+            $t = preg_replace("/\\{\\$:{$m[2]}\\}/", '', $m[3]);
+            $pc["=p_{$m[2]}"] = Qualify($pagename, $t);
+          }
+    }
+  }
+  return @$PCache[$pagename]["=p_$var"];
+}
+
+
+function PageVar($pagename, $var, $pn = '') {
+  global $Cursor, $PCache, $FmtPV, $AsSpacedFunction, $ScriptUrl,
+    $EnablePathInfo;
+  if ($var == '$ScriptUrl') return PUE($ScriptUrl);
+  if ($pn) {
+    $pn = isset($Cursor[$pn]) ? $Cursor[$pn] : MakePageName($pagename, $pn);
+  } else $pn = $pagename;
+  if ($pn) {
+    if (preg_match('/^(.+)[.\\/]([^.\\/]+)$/', $pn, $match)
+        && !isset($PCache[$pn]['time']) 
+        && (!@$FmtPV[$var] || strpos($FmtPV[$var], '$page') !== false)) 
+      { $page = ReadPage($pn, READPAGE_CURRENT); PCache($pn, $page); }
+    @list($d, $group, $name) = $match;
+    $page = &$PCache[$pn];
+  } else { $group = ''; $name = ''; }
+  if (@$FmtPV[$var]) return eval("return ({$FmtPV[$var]});");
+  if (strncmp($var, '$:', 2)==0) return PageTextVar($pn, substr($var, 2));
+  return '';
+}
+
+  
+## FmtPageName handles $[internationalization] and $Variable 
+## substitutions in strings based on the $pagename argument.
+function FmtPageName($fmt, $pagename) {
+  # Perform $-substitutions on $fmt relative to page given by $pagename
+  global $GroupPattern, $NamePattern, $EnablePathInfo, $ScriptUrl,
+    $GCount, $UnsafeGlobals, $FmtV, $FmtP, $FmtPV, $PCache, $AsSpacedFunction;
+  if (strpos($fmt,'$')===false) return $fmt;                  
+  $fmt = preg_replace('/\\$([A-Z]\\w*Fmt)\\b/e','$GLOBALS[\'$1\']',$fmt);
+  $fmt = preg_replace('/\\$\\[(?>([^\\]]+))\\]/e',"XL(PSS('$1'))",$fmt);
+  $fmt = str_replace('{$ScriptUrl}', '$ScriptUrl', $fmt);
+  $fmt = 
+    preg_replace('/\\{(\\$[A-Z]\\w+)\\}/e', "PageVar(\$pagename, '$1')", $fmt);
+  if (strpos($fmt,'$')===false) return $fmt;
+  if ($FmtP) $fmt = preg_replace(array_keys($FmtP), array_values($FmtP), $fmt);
+  static $pv, $pvpat;
+  if ($pv != count($FmtPV)) {
+    $pvpat = str_replace('$', '\\$', implode('|', array_keys($FmtPV)));
+    $pv = count($FmtPV);
+  }
+  $fmt = preg_replace("/(?:$pvpat)\\b/e", "PageVar(\$pagename, '$0')", $fmt);
+  $fmt = preg_replace('!\\$ScriptUrl/([^?#\'"\\s<>]+)!e', 
+    (@$EnablePathInfo) ? "'$ScriptUrl/'.PUE('$1')" :
+        "'$ScriptUrl?n='.str_replace('/','.',PUE('$1'))",
+    $fmt);
+  if (strpos($fmt,'$')===false) return $fmt;
+  static $g;
+  if ($GCount != count($GLOBALS)+count($FmtV)) {
+    $g = array();
+    foreach($GLOBALS as $n=>$v) {
+      if (is_array($v) || is_object($v) ||
+         isset($FmtV["\$$n"]) || in_array($n,$UnsafeGlobals)) continue;
+      $g["\$$n"] = $v;
+    }
+    $GCount = count($GLOBALS)+count($FmtV);
+    krsort($g); reset($g);
+  }
+  $fmt = str_replace(array_keys($g),array_values($g),$fmt);
+  $fmt = preg_replace('/(?>(\\$[[:alpha:]]\\w+))/e', 
+          "isset(\$FmtV['$1']) ? \$FmtV['$1'] : '$1'", $fmt); 
+  return $fmt;
+}
+
+##  FmtTemplateVars uses $vars to replace all occurrences of 
+##  {$$key} in $text with $vars['key'].
+function FmtTemplateVars($text, $vars, $pagename = NULL) {
+  global $FmtPV;
+  if ($pagename) {
+    $pat = implode('|', array_map('preg_quote', array_keys($FmtPV)));
+    $text = preg_replace("/\\{\\$($pat)\\}/e", 
+                         "PageVar('$pagename', '$1')", $text);
+  }
+  foreach(preg_grep('/^[\\w$]/', array_keys($vars)) as $k)
+    if (!is_array($vars[$k]))
+      $text = str_replace("{\$\$$k}", $vars[$k], $text);
+  return $text;
+}
+
+## The XL functions provide translation tables for $[i18n] strings
+## in FmtPageName().
+function XL($key) {
+  global $XL,$XLLangs;
+  foreach($XLLangs as $l) if (isset($XL[$l][$key])) return $XL[$l][$key];
+  return $key;
+}
+function XLSDV($lang,$a) {
+  global $XL;
+  foreach($a as $k=>$v) { if (!isset($XL[$lang][$k])) $XL[$lang][$k]=$v; }
+}
+function XLPage($lang,$p) {
+  global $TimeFmt,$XLLangs,$FarmD;
+  $page = ReadPage($p, READPAGE_CURRENT);
+  if (!$page) return;
+  $text = preg_replace("/=>\\s*\n/",'=> ',@$page['text']);
+  foreach(explode("\n",$text) as $l)
+    if (preg_match('/^\\s*[\'"](.+?)[\'"]\\s*=>\\s*[\'"](.+)[\'"]/',$l,$match))
+      $xl[stripslashes($match[1])] = stripslashes($match[2]);
+  if (isset($xl)) {
+    if (@$xl['xlpage-i18n']) {
+      $i18n = preg_replace('/[^-\\w]/','',$xl['xlpage-i18n']);
+      include_once("$FarmD/scripts/xlpage-$i18n.php");
+    }
+    if (@$xl['Locale']) setlocale(LC_ALL,$xl['Locale']);
+    if (@$xl['TimeFmt']) $TimeFmt=$xl['TimeFmt'];
+    if (!in_array($lang, $XLLangs)) array_unshift($XLLangs, $lang);
+    XLSDV($lang,$xl);
+  }
+}
+
+## CmpPageAttr is used with uksort to order a page's elements with
+## the latest items first.  This can make some operations more efficient.
+function CmpPageAttr($a, $b) {
+  @list($x, $agmt) = explode(':', $a);
+  @list($x, $bgmt) = explode(':', $b);
+  if ($agmt != $bgmt) 
+    return ($agmt==0 || $bgmt==0) ? $agmt - $bgmt : $bgmt - $agmt;
+  return strcmp($a, $b);
+}
+
+## class PageStore holds objects that store pages via the native
+## filesystem.
+class PageStore {
+  var $dirfmt;
+  var $iswrite;
+  var $attr;
+  function PageStore($d='$WorkDir/$FullName', $w=0, $a=NULL) { 
+    $this->dirfmt = $d; $this->iswrite = $w; $this->attr = (array)$a;
+    $GLOBALS['PageExistsCache'] = array();
+  }
+  function pagefile($pagename) {
+    global $FarmD;
+    $dfmt = $this->dirfmt;
+    if ($pagename > '') {
+      $pagename = str_replace('/', '.', $pagename);
+      if ($dfmt == 'wiki.d/{$FullName}')               # optimizations for
+        return "wiki.d/$pagename";                     # standard locations
+      if ($dfmt == '$FarmD/wikilib.d/{$FullName}')     # 
+        return "$FarmD/wikilib.d/$pagename";           #
+      if ($dfmt == 'wiki.d/{$Group}/{$FullName}')
+        return preg_replace('/([^.]+).*/', 'wiki.d/$1/$0', $pagename);
+    }
+    return FmtPageName($dfmt, $pagename);
+  }
+  function read($pagename, $since=0) {
+    $newline = '';
+    $urlencoded = false;
+    $pagefile = $this->pagefile($pagename);
+    if ($pagefile && ($fp=@fopen($pagefile, "r"))) {
+      $page = $this->attr;
+      while (!feof($fp)) {
+        $line = fgets($fp, 4096);
+        while (substr($line, -1, 1) != "\n" && !feof($fp)) 
+          { $line .= fgets($fp, 4096); }
+        $line = rtrim($line);
+        if ($urlencoded) $line = urldecode(str_replace('+', '%2b', $line));
+        @list($k,$v) = explode('=', $line, 2);
+        if (!$k) continue;
+        if ($k == 'version') { 
+          $ordered = (strpos($v, 'ordered=1') !== false); 
+          $urlencoded = (strpos($v, 'urlencoded=1') !== false); 
+          if (strpos($v, 'pmwiki-0.')!==false) $newline="\262";
+        }
+        if ($k == 'newline') { $newline = $v; continue; }
+        if ($since > 0 && preg_match('/:(\\d+)/', $k, $m) && $m[1] < $since) {
+          if ($ordered) break;
+          continue;
+        }
+        if ($newline) $v = str_replace($newline, "\n", $v);
+        $page[$k] = $v;
+      }
+      fclose($fp);
+    }
+    return @$page;
+  }
+  function write($pagename,$page) {
+    global $Now, $Version;
+    $page['name'] = $pagename;
+    $page['time'] = $Now;
+    $page['host'] = $_SERVER['REMOTE_ADDR'];
+    $page['agent'] = @$_SERVER['HTTP_USER_AGENT'];
+    $page['rev'] = @$page['rev']+1;
+    unset($page['version']); unset($page['newline']);
+    uksort($page, 'CmpPageAttr');
+    $s = false;
+    $pagefile = $this->pagefile($pagename);
+    $dir = dirname($pagefile); mkdirp($dir);
+    if (!file_exists("$dir/.htaccess") && $fp = @fopen("$dir/.htaccess", "w")) 
+      { fwrite($fp, "Order Deny,Allow\nDeny from all\n"); fclose($fp); }
+    if ($pagefile && ($fp=fopen("$pagefile,new","w"))) {
+      $r0 = array('%', "\n", '<');
+      $r1 = array('%25', '%0a', '%3c');
+      $x = "version=$Version ordered=1 urlencoded=1\n";
+      $s = true && fputs($fp, $x); $sz = strlen($x);
+      foreach($page as $k=>$v) 
+        if ($k > '' && $k{0} != '=') {
+          $x = str_replace($r0, $r1, "$k=$v") . "\n";
+          $s = $s && fputs($fp, $x); $sz += strlen($x);
+        }
+      $s = fclose($fp) && $s;
+      $s = $s && (filesize("$pagefile,new") > $sz * 0.95);
+      if (file_exists($pagefile)) $s = $s && unlink($pagefile);
+      $s = $s && rename("$pagefile,new", $pagefile);
+    }
+    $s && fixperms($pagefile);
+    if (!$s)
+      Abort("Cannot write page to $pagename ($pagefile)...changes not saved");
+    PCache($pagename, $page);
+  }
+  function exists($pagename) {
+    if (!$pagename) return false;
+    $pagefile = $this->pagefile($pagename);
+    return ($pagefile && file_exists($pagefile));
+  }
+  function delete($pagename) {
+    global $Now;
+    $pagefile = $this->pagefile($pagename);
+    @rename($pagefile,"$pagefile,del-$Now");
+  }
+  function ls($pats=NULL) {
+    global $GroupPattern, $NamePattern;
+    StopWatch("PageStore::ls begin {$this->dirfmt}");
+    $pats=(array)$pats; 
+    array_push($pats, "/^$GroupPattern\.$NamePattern$/");
+    $dir = $this->pagefile('$Group.$Name');
+    $maxslash = substr_count($dir, '/');
+    $dirlist = array(preg_replace('!/*[^/]*\\$.*$!','',$dir));
+    $out = array();
+    while (count($dirlist)>0) {
+      $dir = array_shift($dirlist);
+      $dfp = @opendir($dir); if (!$dfp) { continue; }
+      $dirslash = substr_count($dir, '/') + 1;
+      $o = array();
+      while ( ($pagefile = readdir($dfp)) !== false) {
+        if ($pagefile{0} == '.') continue;
+        if ($dirslash < $maxslash && is_dir("$dir/$pagefile"))
+          { array_push($dirlist,"$dir/$pagefile"); continue; }
+        if ($dirslash == $maxslash) $o[] = $pagefile;
+      }
+      closedir($dfp);
+      StopWatch("PageStore::ls merge {$this->dirfmt}");
+      $out = array_merge($out, MatchPageNames($o, $pats));
+    }
+    StopWatch("PageStore::ls end {$this->dirfmt}");
+    return $out;
+  }
+}
+
+function ReadPage($pagename, $since=0) {
+  # read a page from the appropriate directories given by $WikiReadDirsFmt.
+  global $WikiLibDirs,$Now;
+  foreach ($WikiLibDirs as $dir) {
+    $page = $dir->read($pagename, $since);
+    if ($page) break;
+  }
+  if (@!$page) $page['ctime'] = $Now;
+  if (@!$page['time']) $page['time'] = $Now;
+  return $page;
+}
+
+function WritePage($pagename,$page) {
+  global $WikiLibDirs,$WikiDir,$LastModFile;
+  $WikiDir->iswrite = 1;
+  for($i=0; $i<count($WikiLibDirs); $i++) {
+    $wd = &$WikiLibDirs[$i];
+    if ($wd->iswrite && $wd->exists($pagename)) break;
+  }
+  if ($i >= count($WikiLibDirs)) $wd = &$WikiDir;
+  $wd->write($pagename,$page);
+  if ($LastModFile && !@touch($LastModFile)) 
+    { unlink($LastModFile); touch($LastModFile); fixperms($LastModFile); }
+}
+
+function PageExists($pagename) {
+  ##  note:  $PageExistsCache might change or disappear someday
+  global $WikiLibDirs, $PageExistsCache;
+  if (!isset($PageExistsCache[$pagename])) {
+    foreach((array)$WikiLibDirs as $dir)
+      if ($PageExistsCache[$pagename] = $dir->exists($pagename)) break;
+  }
+  return $PageExistsCache[$pagename];
+}
+
+function ListPages($pat=NULL) {
+  global $WikiLibDirs;
+  foreach((array)$WikiLibDirs as $dir) 
+    $out = array_unique(array_merge($dir->ls($pat),(array)@$out));
+  return $out;
+}
+
+function RetrieveAuthPage($pagename, $level, $authprompt=true, $since=0) {
+  global $AuthFunction;
+  SDV($AuthFunction,'PmWikiAuth');
+  if (!function_exists($AuthFunction)) return ReadPage($pagename, $since);
+  return $AuthFunction($pagename, $level, $authprompt, $since);
+}
+
+function Abort($msg, $info='') {
+  # exit pmwiki with an abort message
+  global $ScriptUrl;
+  if ($info) 
+    $info = "<p class='vspace'><a target='_blank' rel='nofollow' href='http://www.pmwiki.org/pmwiki/info/$info'>$[More information]</a></p>";
+  $msg = "<h3>$[PmWiki can't process your request]</h3>
+    <p class='vspace'>$msg</p>
+    <p class='vspace'>We are sorry for any inconvenience.</p>
+    $info
+    <p class='vspace'><a href='$ScriptUrl'>$[Return to] $ScriptUrl</a></p>";
+  echo preg_replace('/\\$\\[([^\\]]+)\\]/e', "XL(PSS('$1'))", $msg);
+  exit;
+}
+
+function Redirect($pagename, $urlfmt='$PageUrl') {
+  # redirect the browser to $pagename
+  global $EnableRedirect, $RedirectDelay, $EnableStopWatch;
+  SDV($RedirectDelay, 0);
+  clearstatcache();
+  $pageurl = FmtPageName($urlfmt,$pagename);
+  if (IsEnabled($EnableRedirect,1) && 
+      (!isset($_REQUEST['redirect']) || $_REQUEST['redirect'])) {
+    header("Location: $pageurl");
+    header("Content-type: text/html");
+    echo "<html><head>
+      <meta http-equiv='Refresh' Content='$RedirectDelay; URL=$pageurl' />
+     <title>Redirect</title></head><body></body></html>";
+     exit;
+  }
+  echo "<a href='$pageurl'>Redirect to $pageurl</a>";
+  if (@$EnableStopWatch && function_exists('StopWatchHTML'))
+    StopWatchHTML($pagename, 1);
+  exit;
+}
+
+function PrintFmt($pagename,$fmt) {
+  global $HTTPHeaders,$FmtV;
+  if (is_array($fmt)) 
+    { foreach($fmt as $f) PrintFmt($pagename,$f); return; }
+  if ($fmt == 'headers:') {
+    foreach($HTTPHeaders as $h) (@$sent++) ? @header($h) : header($h);
+    return;
+  }
+  $x = FmtPageName($fmt,$pagename);
+  if (strncmp($fmt, 'function:', 9) == 0 &&
+      preg_match('/^function:(\S+)\s*(.*)$/s', $x, $match) &&
+      function_exists($match[1]))
+    { $match[1]($pagename,$match[2]); return; }
+  if (strncmp($fmt, 'file:', 5) == 0 && preg_match("/^file:(.+)/s",$x,$match)) {
+    $filelist = preg_split('/[\\s]+/',$match[1],-1,PREG_SPLIT_NO_EMPTY);
+    foreach($filelist as $f) {
+      if (file_exists($f)) { include($f); return; }
+    }
+    return;
+  }
+  if (substr($x, 0, 7) == 'markup:')
+    { print MarkupToHTML($pagename, substr($x, 7)); return; }
+  if (substr($x, 0, 5) == 'wiki:')
+    { PrintWikiPage($pagename, substr($x, 5), 'read'); return; }
+  if (substr($x, 0, 5) == 'page:')
+    { PrintWikiPage($pagename, substr($x, 5), ''); return; }
+  echo $x;
+}
+
+function PrintWikiPage($pagename, $wikilist=NULL, $auth='read') {
+  if (is_null($wikilist)) $wikilist=$pagename;
+  $pagelist = preg_split('/\s+/',$wikilist,-1,PREG_SPLIT_NO_EMPTY);
+  foreach($pagelist as $p) {
+    if (PageExists($p)) {
+      $page = ($auth) ? RetrieveAuthPage($p, $auth, false, READPAGE_CURRENT)
+              : ReadPage($p, READPAGE_CURRENT);
+      if ($page['text']) 
+        echo MarkupToHTML($pagename,Qualify($p, $page['text']));
+      return;
+    }
+  }
+}
+
+function Keep($x, $pool=NULL) {
+  # Keep preserves a string from being processed by wiki markups
+  global $BlockPattern, $KeepToken, $KPV, $KPCount;
+  $x = preg_replace("/$KeepToken(\\d.*?)$KeepToken/e", "\$KPV['\$1']", $x);
+  if (is_null($pool) && preg_match("!</?($BlockPattern)\\b!", $x)) $pool = 'B';
+  $KPCount++; $KPV[$KPCount.$pool]=$x;
+  return $KeepToken.$KPCount.$pool.$KeepToken;
+}
+
+
+##  MarkupEscape examines markup source and escapes any [@...@]
+##  and [=...=] sequences using Keep().  MarkupRestore undoes the
+##  effect of any MarkupEscape().
+function MarkupEscape($text) {
+  global $EscapePattern;
+  SDV($EscapePattern, '\\[([=@]).*?\\1\\]');
+  return preg_replace("/$EscapePattern/es", "Keep(PSS('$0'))", $text);
+}
+function MarkupRestore($text) {
+  global $KeepToken, $KPV;
+  return preg_replace("/$KeepToken(\\d.*?)$KeepToken/e", "\$KPV['$1']", $text);
+}
+
+
+##  Qualify() applies $QualifyPatterns to convert relative links
+##  and references into absolute equivalents.
+function Qualify($pagename, $text) {
+  global $QualifyPatterns, $KeepToken, $KPV;
+  if (!@$QualifyPatterns) return $text;
+  $text = MarkupEscape($text);
+  $group = PageVar($pagename, '$Group');
+  $name = PageVar($pagename, '$Name');
+  foreach((array)$QualifyPatterns as $pat => $rep) 
+    $text = preg_replace($pat, $rep, $text);
+  return MarkupRestore($text);
+}
+
+
+function CondText($pagename,$condspec,$condtext) {
+  global $Conditions;
+  if (!preg_match("/^(\\S+)\\s*(!?)\\s*(\\S+)?\\s*(.*?)\\s*$/",
+    $condspec,$match)) return '';
+  @list($condstr,$condtype,$not,$condname,$condparm) = $match;
+  if (isset($Conditions[$condname])) {
+    $tf = @eval("return (".$Conditions[$condname].");");
+    if (!$tf xor $not) $condtext='';
+  }
+  return $condtext;
+}
+
+
+##  TextSection extracts a section of text delimited by page anchors.
+##  The $sections parameter can have the form
+##    #abc           - [[#abc]] to next anchor
+##    #abc#def       - [[#abc]] up to [[#def]]
+##    #abc#, #abc..  - [[#abc]] to end of text
+##    ##abc, ..#abc  - beginning of text to [[#abc]]
+##  Returns the text unchanged if no sections are requested,
+##  or false if a requested beginning anchor isn't in the text.
+function TextSection($text, $sections, $args = NULL) {
+  $args = (array)$args;
+  $npat = '[[:alpha:]][-\\w*]*';
+  if (!preg_match("/#($npat)?(\\.\\.)?(#($npat)?)?/", $sections, $match))
+    return $text;
+  @list($x, $aa, $dots, $b, $bb) = $match;
+  if (!$dots && !$b) $bb = $npat;
+  if ($aa) {
+    $pos = strpos($text, "[[#$aa]]");  if ($pos === false) return false;
+    if (@$args['anchors']) 
+      while ($pos > 0 && $text[$pos-1] != "\n") $pos--;
+    else $pos += strlen("[[#$aa]]");
+    $text = substr($text, $pos);
+  }
+  if ($bb)
+    $text = preg_replace("/(\n)[^\n]*\\[\\[#$bb\\]\\].*$/s", '$1', $text, 1);
+  return $text;
+}
+
+
+##  RetrieveAuthSection extracts a section of text from a page.
+##  If $pagesection starts with anything other than '#', it identifies
+##  the page to extract text from.  Otherwise RetrieveAuthSection looks
+##  in the pages given by $list, or in $pagename if $list is not specified.
+##  The selected page is placed in the global $RASPageName variable.
+##  The caller is responsible for calling Qualify() as needed.
+function RetrieveAuthSection($pagename, $pagesection, $list=NULL, $auth='read') {
+  global $RASPageName;
+  if ($pagesection{0} != '#')
+    $list = array(MakePageName($pagename, $pagesection));
+  else if (is_null($list)) $list = array($pagename);
+  foreach((array)$list as $t) {
+    $t = FmtPageName($t, $pagename);
+    if (!PageExists($t)) continue;
+    $tpage = RetrieveAuthPage($t, $auth, false, READPAGE_CURRENT);
+    if (!$tpage) continue;
+    $text = TextSection($tpage['text'], $pagesection);
+    if ($text !== false) { $RASPageName = $t; return $text; }
+  }
+  $RASPageName = '';
+  return false;
+}
+
+
+function IncludeText($pagename, $inclspec) {
+  global $MaxIncludes, $IncludeOpt, $InclCount;
+  SDV($MaxIncludes,50);
+  SDVA($IncludeOpt, array('self'=>1));
+  $npat = '[[:alpha:]][-\\w]*';
+  if ($InclCount++>=$MaxIncludes) return Keep($inclspec);
+  $args = array_merge($IncludeOpt, ParseArgs($inclspec));
+  while (count($args['#'])>0) {
+    $k = array_shift($args['#']); $v = array_shift($args['#']);
+    if ($k=='') {
+      if ($v{0} != '#') {
+        if (isset($itext)) continue;
+        $iname = MakePageName($pagename, $v);
+        if (!$args['self'] && $iname == $pagename) continue;
+        $ipage = RetrieveAuthPage($iname, 'read', false, READPAGE_CURRENT);
+        $itext = @$ipage['text'];
+      }
+      $itext = TextSection($itext, $v, array('anchors' => 1));
+      continue;
+    }
+    if (preg_match('/^(?:line|para)s?$/', $k)) {
+      preg_match('/^(\\d*)(\\.\\.(\\d*))?$/', $v, $match);
+      @list($x, $a, $dots, $b) = $match;
+      $upat = ($k{0} == 'p') ? ".*?(\n\\s*\n|$)" : "[^\n]*(?:\n|$)";
+      if (!$dots) { $b=$a; $a=0; }
+      if ($a>0) $a--;
+      $itext=preg_replace("/^(($upat){0,$b}).*$/s",'$1',$itext,1);
+      $itext=preg_replace("/^($upat){0,$a}/s",'',$itext,1);
+      continue;
+    }
+  }
+  $basepage = isset($args['basepage']) 
+              ? MakePageName($pagename, $args['basepage'])
+              : $iname;
+  if ($basepage) $itext = Qualify(@$basepage, @$itext);
+  return FmtTemplateVars(PVSE($itext), $args);
+}
+
+
+function RedirectMarkup($pagename, $opt) {
+  $k = Keep("(:redirect $opt:)");
+  global $MarkupFrame;
+  if (!@$MarkupFrame[0]['redirect']) return $k;
+  $opt = ParseArgs($opt);
+  $to = @$opt['to']; if (!$to) $to = @$opt[''][0];
+  if (!$to) return $k;
+  if (preg_match('/^([^#]+)(#[A-Za-z][-\\w]*)$/', $to, $match)) 
+    { $to = $match[1]; $anchor = $match[2]; }
+  $to = MakePageName($pagename, $to);
+  if (!PageExists($to)) return $k;
+  if ($to == $pagename) return '';
+  if (@$opt['from'] 
+      && !MatchPageNames($pagename, FixGlob($opt['from'], '$1*.$2')))
+    return '';
+  if (preg_match('/^30[1237]$/', @$opt['status'])) 
+     header("HTTP/1.1 {$opt['status']}");
+  Redirect($to, @"{\$PageUrl}?from=$pagename$anchor");
+  exit();
+}
+   
+
+function Block($b) {
+  global $BlockMarkups,$HTMLVSpace,$HTMLPNewline,$MarkupFrame;
+  $mf = &$MarkupFrame[0]; $cs = &$mf['cs']; $vspaces = &$mf['vs'];
+  $out = '';
+  if ($b == 'vspace') {
+    $vspaces .= "\n";
+    while (count($cs)>0 && @end($cs)!='pre' && @$BlockMarkups[@end($cs)][3]==0) 
+      { $c = array_pop($cs); $out .= $BlockMarkups[$c][2]; }
+    return $out;
+  }
+  @list($code, $depth, $icol) = explode(',', $b);
+  if (!$code) $depth = 1;
+  if ($depth == 0) $depth = strlen($depth);
+  if ($icol == 0) $icol = strlen($icol);
+  if ($depth > 0) $depth += @$mf['idep'];
+  if ($icol > 0) $mf['is'][$depth] = $icol + @$mf['icol'];
+  @$mf['idep'] = @$mf['icol'] = 0;
+  while (count($cs)>$depth) 
+    { $c = array_pop($cs); $out .= $BlockMarkups[$c][2]; }
+  if (!$code) {
+    if (@end($cs) == 'p') { $out .= $HTMLPNewline; $code = 'p'; }
+    else if ($depth < 2) { $code = 'p'; $mf['is'][$depth] = 0; }
+    else { $out .= $HTMLPNewline; $code = 'block'; }
+  }
+  if ($depth>0 && $depth==count($cs) && $cs[$depth-1]!=$code)
+    { $c = array_pop($cs); $out .= $BlockMarkups[$c][2]; }
+  while (count($cs)>0 && @end($cs)!=$code &&
+      @$BlockMarkups[@end($cs)][3]==0)
+    { $c = array_pop($cs); $out .= $BlockMarkups[$c][2]; }
+  if ($vspaces) { 
+    $out .= (@end($cs) == 'pre') ? $vspaces : $HTMLVSpace; 
+    $vspaces=''; 
+  }
+  if ($depth==0) { return $out; }
+  if ($depth==count($cs)) { return $out.$BlockMarkups[$code][1]; }
+  while (count($cs)<$depth-1) { 
+    array_push($cs, 'dl'); $mf['is'][count($cs)] = 0;
+    $out .= $BlockMarkups['dl'][0].'<dd>'; 
+  }
+  if (count($cs)<$depth) {
+    array_push($cs,$code);
+    $out .= $BlockMarkups[$code][0];
+  }
+  return $out;
+}
+
+
+function MarkupClose($key = '') {
+  global $MarkupFrame;
+  $cf = & $MarkupFrame[0]['closeall'];
+  $out = '';
+  if ($key == '' || isset($cf[$key])) {
+    $k = array_keys((array)$cf);
+    while ($k) { 
+      $x = array_pop($k); $out .= $cf[$x]; unset($cf[$x]);
+      if ($x == $key) break;
+    }
+  }
+  return $out;
+}
+
+
+function FormatTableRow($x, $sep = '\\|\\|') {
+  global $Block, $TableCellAttrFmt, $MarkupFrame, $TableRowAttrFmt, 
+    $TableRowIndexMax, $FmtV;
+  static $rowcount;
+  $x = preg_replace("/$sep\\s*$/",'',$x);
+  $td = preg_split("/$sep/", $x); $y = '';
+  for($i=0;$i<count($td);$i++) {
+    if ($td[$i]=='') continue;
+    $FmtV['$TableCellCount'] = $i;
+    $attr = FmtPageName(@$TableCellAttrFmt, '');
+    $td[$i] = preg_replace('/^(!?)\\s+$/', '$1&nbsp;', $td[$i]);
+    if (preg_match('/^!(.*?)!$/',$td[$i],$match))
+      { $td[$i]=$match[1]; $t='caption'; $attr=''; }
+    elseif (preg_match('/^!(.*)$/',$td[$i],$match)) 
+      { $td[$i]=$match[1]; $t='th'; }
+    else $t='td';
+    if (preg_match('/^\\s.*\\s$/',$td[$i])) { $attr .= " align='center'"; }
+    elseif (preg_match('/^\\s/',$td[$i])) { $attr .= " align='right'"; }
+    elseif (preg_match('/\\s$/',$td[$i])) { $attr .= " align='left'"; }
+    for ($colspan=1;$i+$colspan<count($td);$colspan++) 
+      if ($td[$colspan+$i]!='') break;
+    if ($colspan>1) { $attr .= " colspan='$colspan'"; }
+    $y .= "<$t $attr>".trim($td[$i])."</$t>";
+  }
+  if ($t=='caption') return "<:table,1>$y";
+  if (@$MarkupFrame[0]['cs'][0] != 'table') $rowcount = 0; else $rowcount++;
+  $FmtV['$TableRowCount'] = $rowcount + 1;
+  $FmtV['$TableRowIndex'] = ($rowcount % $TableRowIndexMax) + 1;
+  $trattr = FmtPageName(@$TableRowAttrFmt, '');
+  return "<:table,1><tr $trattr>$y</tr>";
+}
+
+function LinkIMap($pagename,$imap,$path,$alt,$txt,$fmt=NULL) {
+  global $FmtV, $IMap, $IMapLinkFmt, $UrlLinkFmt;
+  $FmtV['$LinkUrl'] = PUE(str_replace('$1',$path,$IMap[$imap]));
+  $FmtV['$LinkText'] = $txt;
+  $FmtV['$LinkAlt'] = str_replace(array('"',"'"),array('&#34;','&#39;'),$alt);
+  if (!$fmt) 
+    $fmt = (isset($IMapLinkFmt[$imap])) ? $IMapLinkFmt[$imap] : $UrlLinkFmt;
+  return str_replace(array_keys($FmtV),array_values($FmtV),$fmt);
+}
+
+function LinkPage($pagename,$imap,$path,$alt,$txt,$fmt=NULL) {
+  global $QueryFragPattern, $LinkPageExistsFmt, $LinkPageSelfFmt,
+    $LinkPageCreateSpaceFmt, $LinkPageCreateFmt, $LinkTargets,
+    $EnableLinkPageRelative;
+  if (!$fmt && $path{0} == '#') {
+    $path = preg_replace("/[^-.:\\w]/", '', $path);
+    return ($path) ? "<a href='#$path'>$txt</a>" : '';
+  }
+  if (!preg_match("/^\\s*([^#?]+)($QueryFragPattern)?$/",$path,$match))
+    return '';
+  $tgtname = MakePageName($pagename, $match[1]); 
+  if (!$tgtname) return '';
+  $qf = @$match[2];
+  @$LinkTargets[$tgtname]++;
+  if (!$fmt) {
+    if (!PageExists($tgtname) && !preg_match('/[&?]action=/', $qf))
+      $fmt = preg_match('/\\s/', $txt) 
+             ? $LinkPageCreateSpaceFmt : $LinkPageCreateFmt;
+    else
+      $fmt = ($tgtname == $pagename && $qf == '') 
+             ? $LinkPageSelfFmt : $LinkPageExistsFmt;
+  }
+  $url = PageVar($tgtname, '$PageUrl');
+  if (@$EnableLinkPageRelative) 
+    $url = preg_replace('!^[a-z]+://[^/]*!i', '', $url);
+  $fmt = str_replace(array('$LinkUrl', '$LinkText'),
+                     array($url.PUE($qf), $txt), $fmt);
+  return FmtPageName($fmt,$tgtname);
+}
+
+function MakeLink($pagename,$tgt,$txt=NULL,$suffix=NULL,$fmt=NULL) {
+  global $LinkPattern,$LinkFunctions,$UrlExcludeChars,$ImgExtPattern,$ImgTagFmt;
+  $t = preg_replace('/[()]/','',trim($tgt));
+  $t = preg_replace('/<[^>]*>/','',$t);
+  preg_match("/^($LinkPattern)?(.+?)(\"(.*)\")?$/",$t,$m);
+  if (!$m[1]) $m[1]='<:page>';
+  if (preg_match("/(($LinkPattern)([^$UrlExcludeChars]+$ImgExtPattern))(\"(.*)\")?$/",$txt,$tm)) 
+    $txt = $LinkFunctions[$tm[2]]($pagename,$tm[2],$tm[3],@$tm[5],
+      $tm[1],$ImgTagFmt);
+  else {
+    if (is_null($txt)) {
+      $txt = preg_replace('/\\([^)]*\\)/','',$tgt);
+      if ($m[1]=='<:page>') {
+        $txt = preg_replace('!/\\s*$!', '', $txt);
+        $txt = preg_replace('!^.*[^<]/!', '', $txt);
+      }
+    }
+    $txt .= $suffix;
+  }
+  $out = $LinkFunctions[$m[1]]($pagename,$m[1],$m[2],@$m[4],$txt,$fmt);
+  return $out;
+}
+
+function Markup($id, $when, $pat=NULL, $rep=NULL) {
+  global $MarkupTable,$MarkupRules;
+  unset($MarkupRules);
+  if (preg_match('/^([<>])?(.+)$/', $when, $m)) {
+    $MarkupTable[$id]['cmd'] = $when;
+    $MarkupTable[$m[2]]['dep'][$id] = $m[1];
+    if (!$m[1]) $m[1] = '=';
+    if (@$MarkupTable[$m[2]]['seq']) {
+      $MarkupTable[$id]['seq'] = $MarkupTable[$m[2]]['seq'].$m[1];
+      foreach((array)@$MarkupTable[$id]['dep'] as $i=>$m)
+        Markup($i,"$m$id");
+      unset($MarkupTable[$id]['dep']);
+    }
+  }
+  if ($pat && !isset($MarkupTable[$id]['pat'])) {
+    $MarkupTable[$id]['pat'] = $pat;
+    $MarkupTable[$id]['rep'] = $rep;
+  }
+}
+
+function DisableMarkup() {
+  global $MarkupTable;
+  $idlist = func_get_args();
+  unset($MarkupRules);
+  while (count($idlist)>0) {
+    $id = array_shift($idlist);
+    if (is_array($id)) { $idlist = array_merge($idlist, $id); continue; }
+    $MarkupTable[$id] = array('cmd' => 'none', 'pat'=>'');
+  }
+}
+    
+function mpcmp($a,$b) { return @strcmp($a['seq'].'=',$b['seq'].'='); }
+function BuildMarkupRules() {
+  global $MarkupTable,$MarkupRules,$LinkPattern;
+  if (!$MarkupRules) {
+    uasort($MarkupTable,'mpcmp');
+    foreach($MarkupTable as $id=>$m) 
+      if (@$m['pat'] && @$m['seq']) 
+        $MarkupRules[str_replace('\\L',$LinkPattern,$m['pat'])]=$m['rep'];
+  }
+  return $MarkupRules;
+}
+
+
+function MarkupToHTML($pagename, $text, $opt = NULL) {
+  # convert wiki markup text to HTML output
+  global $MarkupRules, $MarkupFrame, $MarkupFrameBase, $WikiWordCount,
+    $K0, $K1, $RedoMarkupLine;
+
+  StopWatch('MarkupToHTML begin');
+  array_unshift($MarkupFrame, array_merge($MarkupFrameBase, (array)$opt));
+  $MarkupFrame[0]['wwcount'] = $WikiWordCount;
+  $markrules = BuildMarkupRules();
+  foreach((array)$text as $l) 
+    $lines[] = $MarkupFrame[0]['escape'] ? PVSE($l) : $l;
+  $lines[] = '(:closeall:)';
+  $out = '';
+  while (count($lines)>0) {
+    $x = array_shift($lines);
+    $RedoMarkupLine=0;
+    foreach($markrules as $p=>$r) {
+      if ($p{0} == '/') $x=preg_replace($p,$r,$x); 
+      elseif (strstr($x,$p)!==false) $x=eval($r);
+      if (isset($php_errormsg)) 
+        { echo "ERROR: pat=$p $php_errormsg"; unset($php_errormsg); }
+      if ($RedoMarkupLine) { $lines=array_merge((array)$x,$lines); continue 2; }
+    }
+    if ($x>'') $out .= "$x\n";
+  }
+  foreach((array)(@$MarkupFrame[0]['posteval']) as $v) eval($v);
+  array_shift($MarkupFrame);
+  StopWatch('MarkupToHTML end');
+  return $out;
+}
+   
+function HandleBrowse($pagename, $auth = 'read') {
+  # handle display of a page
+  global $DefaultPageTextFmt, $PageNotFoundHeaderFmt, $HTTPHeaders,
+    $EnableHTMLCache, $NoHTMLCache, $PageCacheFile, $LastModTime, $IsHTMLCached,
+    $FmtV, $HandleBrowseFmt, $PageStartFmt, $PageEndFmt, $PageRedirectFmt;
+  $page = RetrieveAuthPage($pagename, $auth, true, READPAGE_CURRENT);
+  if (!$page) Abort("?cannot read $pagename");
+  PCache($pagename,$page);
+  if (PageExists($pagename)) $text = @$page['text'];
+  else {
+    SDV($DefaultPageTextFmt,'(:include $[{$SiteGroup}.PageNotFound]:)');
+    $text = FmtPageName($DefaultPageTextFmt, $pagename);
+    SDV($PageNotFoundHeaderFmt, 'HTTP/1.1 404 Not Found');
+    SDV($HTTPHeaders['status'], $PageNotFoundHeaderFmt);
+  }
+  $opt = array();
+  SDV($PageRedirectFmt,"<p><i>($[redirected from] <a rel='nofollow' 
+    href='{\$PageUrl}?action=edit'>{\$FullName}</a>)</i></p>\$HTMLVSpace\n");
+  if (@!$_GET['from']) { $opt['redirect'] = 1; $PageRedirectFmt = ''; }
+  else $PageRedirectFmt = FmtPageName($PageRedirectFmt, $_GET['from']);
+  if (@$EnableHTMLCache && !$NoHTMLCache && $PageCacheFile && 
+      @filemtime($PageCacheFile) > $LastModTime) {
+    list($ctext) = unserialize(file_get_contents($PageCacheFile));
+    $FmtV['$PageText'] = "<!--cached-->$ctext";
+    $IsHTMLCached = 1;
+    StopWatch("HandleBrowse: using cached copy");
+  } else {
+    $IsHTMLCached = 0;
+    $text = '(:groupheader:)'.@$text.'(:groupfooter:)';
+    $t1 = time();
+    $FmtV['$PageText'] = MarkupToHTML($pagename, $text, $opt);
+    if (@$EnableHTMLCache > 0 && !$NoHTMLCache && $PageCacheFile
+        && (time() - $t1 + 1) >= $EnableHTMLCache) {
+      $fp = @fopen("$PageCacheFile,new", "x");
+      if ($fp) { 
+        StopWatch("HandleBrowse: caching page");
+        fwrite($fp, serialize(array($FmtV['$PageText']))); fclose($fp);
+        rename("$PageCacheFile,new", $PageCacheFile);
+      }
+    }
+  }
+  SDV($HandleBrowseFmt,array(&$PageStartFmt, &$PageRedirectFmt, '$PageText',
+    &$PageEndFmt));
+  PrintFmt($pagename,$HandleBrowseFmt);
+}
+
+
+## UpdatePage goes through all of the steps needed to update a page,
+## preserving page history, computing link targets, page titles, 
+## and other page attributes.  It does this by calling each entry
+## in $EditFunctions.  $pagename is the name of the page to be updated,
+## $page is the old version of the page (used for page history),
+## $new is the new version of the page to be saved, and $fnlist is
+## an optional list of functions to use instead of $EditFunctions.
+function UpdatePage(&$pagename, &$page, &$new, $fnlist = NULL) {
+  global $EditFunctions, $IsPagePosted;
+  StopWatch("UpdatePage: begin $pagename");
+  if (is_null($fnlist)) $fnlist = $EditFunctions;
+  $IsPagePosted = false;
+  foreach((array)$fnlist as $fn) {
+    StopWatch("UpdatePage: $fn ($pagename)");
+    $fn($pagename, $page, $new);
+  }
+  StopWatch("UpdatePage: end $pagename");
+  return $IsPagePosted;
+}
+
+
+# EditTemplate allows a site administrator to pre-populate new pages
+# with the contents of another page.
+function EditTemplate($pagename, &$page, &$new) {
+  global $EditTemplatesFmt;
+  if (@$new['text'] > '') return;
+  if (@$_REQUEST['template'] && PageExists($_REQUEST['template'])) {
+    $p = RetrieveAuthPage($_REQUEST['template'], 'read', false,
+             READPAGE_CURRENT);
+    if ($p['text'] > '') $new['text'] = $p['text']; 
+    return;
+  }
+  foreach((array)$EditTemplatesFmt as $t) {
+    $p = RetrieveAuthPage(FmtPageName($t,$pagename), 'read', false,
+             READPAGE_CURRENT);
+    if (@$p['text'] > '') { $new['text'] = $p['text']; return; }
+  }
+}
+
+# RestorePage handles returning to the version of text as of
+# the version given by $restore or $_REQUEST['restore'].
+function RestorePage($pagename,&$page,&$new,$restore=NULL) {
+  if (is_null($restore)) $restore=@$_REQUEST['restore'];
+  if (!$restore) return;
+  $t = $page['text'];
+  $nl = (substr($t,-1)=="\n");
+  $t = explode("\n",$t);
+  if ($nl) array_pop($t);
+  krsort($page); reset($page);
+  foreach($page as $k=>$v) {
+    if ($k<$restore) break;
+    if (strncmp($k, 'diff:', 5) != 0) continue;
+    foreach(explode("\n",$v) as $x) {
+      if (preg_match('/^(\\d+)(,(\\d+))?([adc])(\\d+)/',$x,$match)) {
+        $a1 = $a2 = $match[1];
+        if ($match[3]) $a2=$match[3];
+        $b1 = $match[5];
+        if ($match[4]=='d') array_splice($t,$b1,$a2-$a1+1);
+        if ($match[4]=='c') array_splice($t,$b1-1,$a2-$a1+1);
+        continue;
+      }
+      if (strncmp($x,'< ',2) == 0) { $nlflag=true; continue; }
+      if (preg_match('/^> (.*)$/',$x,$match)) {
+        $nlflag=false;
+        array_splice($t,$b1-1,0,$match[1]); $b1++;
+      }
+      if ($x=='\\ No newline at end of file') $nl=$nlflag;
+    }
+  }
+  if ($nl) $t[]='';
+  $new['text']=implode("\n",$t);
+  return $new['text'];
+}
+
+## ReplaceOnSave performs text replacements on the text being posted.
+## Patterns held in $ROEPatterns are replaced on every edit request,
+## patterns held in $ROSPatterns are replaced only when the page
+## is being posted (as signaled by $EnablePost).
+function ReplaceOnSave($pagename,&$page,&$new) {
+  global $EnablePost, $ROSPatterns, $ROEPatterns;
+  foreach ((array)@$ROEPatterns as $pat => $rep)
+    $new['text'] = preg_replace($pat, $rep, $new['text']);
+  if (!$EnablePost) return;
+  foreach((array)@$ROSPatterns as $pat=>$rep) 
+    $new['text'] = preg_replace($pat, $rep, $new['text']);
+}
+
+function SaveAttributes($pagename,&$page,&$new) {
+  global $EnablePost, $LinkTargets, $SaveAttrPatterns, $PCache,
+    $SaveProperties;
+  if (!$EnablePost) return;
+  $text = preg_replace(array_keys($SaveAttrPatterns), 
+                       array_values($SaveAttrPatterns), $new['text']);
+  $LinkTargets = array();
+  $html = MarkupToHTML($pagename,$text);
+  $new['targets'] = implode(',',array_keys((array)$LinkTargets));
+  $p = & $PCache[$pagename];
+  foreach((array)$SaveProperties as $k) {
+    if (@$p["=p_$k"]) $new[$k] = $p["=p_$k"];
+    else unset($new[$k]);
+  }
+  unset($new['excerpt']);
+}
+
+function PostPage($pagename, &$page, &$new) {
+  global $DiffKeepDays, $DiffFunction, $DeleteKeyPattern, $EnablePost,
+    $Now, $Charset, $Author, $WikiDir, $IsPagePosted;
+  SDV($DiffKeepDays,3650);
+  SDV($DeleteKeyPattern,"^\\s*delete\\s*$");
+  $IsPagePosted = false;
+  if ($EnablePost) {
+    $new['charset'] = $Charset;
+    $new['author'] = @$Author;
+    $new["author:$Now"] = @$Author;
+    $new["host:$Now"] = $_SERVER['REMOTE_ADDR'];
+    $diffclass = preg_replace('/\\W/','',@$_POST['diffclass']);
+    if ($page['time']>0 && function_exists(@$DiffFunction)) 
+      $new["diff:$Now:{$page['time']}:$diffclass"] =
+        $DiffFunction($new['text'],@$page['text']);
+    $keepgmt = $Now-$DiffKeepDays * 86400;
+    $keys = array_keys($new);
+    foreach($keys as $k)
+      if (preg_match("/^\\w+:(\\d+)/",$k,$match) && $match[1]<$keepgmt)
+        unset($new[$k]);
+    if (preg_match("/$DeleteKeyPattern/",$new['text']))
+      $WikiDir->delete($pagename);
+    else WritePage($pagename,$new);
+    $IsPagePosted = true;
+  }
+}
+
+function PostRecentChanges($pagename,&$page,&$new) {
+  global $IsPagePosted, $RecentChangesFmt, $RCDelimPattern, $RCLinesMax;
+  if (!$IsPagePosted) return;
+  foreach($RecentChangesFmt as $rcfmt=>$pgfmt) {
+    $rcname = FmtPageName($rcfmt,$pagename);  if (!$rcname) continue;
+    $pgtext = FmtPageName($pgfmt,$pagename);  if (!$pgtext) continue;
+    if (@$seen[$rcname]++) continue;
+    $rcpage = ReadPage($rcname);
+    $rcelim = preg_quote(preg_replace("/$RCDelimPattern.*$/",' ',$pgtext),'/');
+    $rcpage['text'] = preg_replace("/^.*$rcelim.*\n/m", '', @$rcpage['text']);
+    if (!preg_match("/$RCDelimPattern/",$rcpage['text'])) 
+      $rcpage['text'] .= "$pgtext\n";
+    else
+      $rcpage['text'] = preg_replace("/([^\n]*$RCDelimPattern.*\n)/",
+        "$pgtext\n$1", $rcpage['text'], 1);
+    if (@$RCLinesMax > 0) 
+      $rcpage['text'] = implode("\n", array_slice(
+          explode("\n", $rcpage['text'], $RCLinesMax + 1), 0, $RCLinesMax));
+    WritePage($rcname, $rcpage);
+  }
+}
+
+function AutoCreateTargets($pagename, &$page, &$new) {
+  global $IsPagePosted, $AutoCreate, $LinkTargets;
+  if (!$IsPagePosted) return;
+  foreach((array)@$AutoCreate as $pat => $init) {
+    if (is_null($init)) continue;
+    foreach(preg_grep($pat, array_keys((array)@$LinkTargets)) as $aname) {
+      if (PageExists($aname)) continue;
+      $x = RetrieveAuthPage($aname, 'edit', false, READPAGE_CURRENT);
+      if (!$x) continue;
+      WritePage($aname, $init);
+    }
+  }
+}
+    
+function PreviewPage($pagename,&$page,&$new) {
+  global $IsPageSaved, $FmtV;
+  if (@$_POST['preview']) {
+    $text = '(:groupheader:)'.$new['text'].'(:groupfooter:)';
+    $FmtV['$PreviewText'] = MarkupToHTML($pagename,$text);
+  } 
+}
+  
+function HandleEdit($pagename, $auth = 'edit') {
+  global $IsPagePosted, $EditFields, $ChangeSummary, $EditFunctions, 
+    $EnablePost, $FmtV, $Now, $EditRedirectFmt, 
+    $PageEditForm, $HandleEditFmt, $PageStartFmt, $PageEditFmt, $PageEndFmt;
+  SDV($EditRedirectFmt, '$FullName');
+  if (@$_POST['cancel']) 
+    { Redirect(FmtPageName($EditRedirectFmt, $pagename)); return; }
+  Lock(2);
+  $page = RetrieveAuthPage($pagename, $auth, true);
+  if (!$page) Abort("?cannot edit $pagename"); 
+  PCache($pagename,$page);
+  $new = $page;
+  foreach((array)$EditFields as $k) 
+    if (isset($_POST[$k])) $new[$k]=str_replace("\r",'',stripmagic($_POST[$k]));
+  $new['csum'] = $ChangeSummary;
+  if ($ChangeSummary) $new["csum:$Now"] = $ChangeSummary;
+  $EnablePost &= preg_grep('/^post/', array_keys(@$_POST));
+  UpdatePage($pagename, $page, $new);
+  Lock(0);
+  if ($IsPagePosted && !@$_POST['postedit']) 
+    { Redirect(FmtPageName($EditRedirectFmt, $pagename)); return; }
+  $FmtV['$DiffClassMinor'] = 
+    (@$_POST['diffclass']=='minor') ?  "checked='checked'" : '';
+  $FmtV['$EditText'] = 
+    str_replace('$','&#036;',htmlspecialchars(@$new['text'],ENT_NOQUOTES));
+  $FmtV['$EditBaseTime'] = $Now;
+  if (@$PageEditForm) {
+    $efpage = FmtPageName($PageEditForm, $pagename);
+    $form = RetrieveAuthPage($efpage, 'read', false, READPAGE_CURRENT);
+    if (!$form || !@$form['text']) 
+      Abort("?unable to retrieve edit form $efpage", 'editform');
+    $FmtV['$EditForm'] = MarkupToHTML($pagename, $form['text']);
+  }
+  SDV($PageEditFmt, "<div id='wikiedit'>
+    <h2 class='wikiaction'>$[Editing {\$FullName}]</h2>
+    <form method='post' rel='nofollow' action='\$PageUrl?action=edit'>
+    <input type='hidden' name='action' value='edit' />
+    <input type='hidden' name='n' value='\$FullName' />
+    <input type='hidden' name='basetime' value='\$EditBaseTime' />
+    \$EditMessageFmt
+    <textarea id='text' name='text' rows='25' cols='60'
+      onkeydown='if (event.keyCode==27) event.returnValue=false;'
+      >\$EditText</textarea><br />
+    <input type='submit' name='post' value=' $[Save] ' />");
+  SDV($HandleEditFmt, array(&$PageStartFmt, &$PageEditFmt, &$PageEndFmt));
+  PrintFmt($pagename, $HandleEditFmt);
+}
+
+function HandleSource($pagename, $auth = 'read') {
+  global $HTTPHeaders;
+  $page = RetrieveAuthPage($pagename, $auth, true, READPAGE_CURRENT);
+  if (!$page) Abort("?cannot source $pagename");
+  foreach ($HTTPHeaders as $h) {
+    $h = preg_replace('!^Content-type:\\s+text/html!i',
+             'Content-type: text/plain', $h);
+    header($h);
+  }
+  echo @$page['text'];
+}
+
+## PmWikiAuth provides password-protection of pages using PHP sessions.
+## It is normally called from RetrieveAuthPage.  Since RetrieveAuthPage
+## can be called a lot within a single page execution (i.e., for every
+## page accessed), we cache the results of site passwords and 
+## GroupAttribute pages to be able to speed up subsequent calls.
+function PmWikiAuth($pagename, $level, $authprompt=true, $since=0) {
+  global $DefaultPasswords, $GroupAttributesFmt, $AllowPassword,
+    $AuthCascade, $FmtV, $AuthPromptFmt, $PageStartFmt, $PageEndFmt, 
+    $AuthId, $AuthList, $NoHTMLCache;
+  static $acache;
+  SDV($GroupAttributesFmt,'$Group/GroupAttributes');
+  SDV($AllowPassword,'nopass');
+  $page = ReadPage($pagename, $since);
+  if (!$page) { return false; }
+  if (!isset($acache)) 
+    SessionAuth($pagename, (@$_POST['authpw']) 
+                           ? array('authpw' => array($_POST['authpw'] => 1))
+                           : '');
+  if (@$AuthId) {
+    $AuthList["id:$AuthId"] = 1;
+    $AuthList["id:-$AuthId"] = -1;
+    $AuthList["id:*"] = 1;
+  }
+  $gn = FmtPageName($GroupAttributesFmt, $pagename);
+  if (!isset($acache[$gn])) {
+    $gp = ReadPage($gn, READPAGE_CURRENT);
+    foreach($DefaultPasswords as $k => $v) {
+      $x = array(2, array(), '');
+      $acache['@site'][$k] = IsAuthorized($v, 'site', $x);
+      $AuthList["@_site_$k"] = $acache['@site'][$k][0] ? 1 : 0;
+      $acache[$gn][$k] = IsAuthorized(@$gp["passwd$k"], 'group', 
+                                      $acache['@site'][$k]);
+    }
+  }
+  foreach($DefaultPasswords as $k => $v) 
+    list($page['=auth'][$k], $page['=passwd'][$k], $page['=pwsource'][$k]) =
+      IsAuthorized(@$page["passwd$k"], 'page', $acache[$gn][$k]);
+  foreach($AuthCascade as $k => $t) {
+    if ($page['=auth'][$k]+0 == 2) {
+      $page['=auth'][$k] = $page['=auth'][$t];
+      if ($page['=passwd'][$k] = $page['=passwd'][$t])         # assign
+        $page['=pwsource'][$k] = "cascade:$t";
+    }
+  }
+  if (@$page['=auth']['admin']) 
+    foreach($page['=auth'] as $lv=>$a) @$page['=auth'][$lv] = 3;
+  if (@$page['=passwd']['read']) $NoHTMLCache |= 2;
+  if ($level=='ALWAYS' || @$page['=auth'][$level]) return $page;
+  if (!$authprompt) return false;
+  $GLOBALS['AuthNeeded'] = (@$_POST['authpw']) 
+    ? $page['=pwsource'][$level] . ' ' . $level : '';
+  PCache($pagename, $page);
+  $postvars = '';
+  foreach($_POST as $k=>$v) {
+    if ($k == 'authpw' || $k == 'authid') continue;
+    $v = str_replace('$', '&#036;', 
+             htmlspecialchars(stripmagic($v), ENT_COMPAT));
+    $postvars .= "<input type='hidden' name='$k' value=\"$v\" />\n";
+  }
+  $FmtV['$PostVars'] = $postvars;
+  SDV($AuthPromptFmt,array(&$PageStartFmt,
+    "<p><b>$[Password required]</b></p>
+      <form name='authform' action='{$_SERVER['REQUEST_URI']}' method='post'>
+        $[Password]: <input tabindex='1' type='password' name='authpw' 
+          value='' />
+        <input type='submit' value='OK' />\$PostVars</form>
+        <script language='javascript' type='text/javascript'><!--
+          document.authform.authpw.focus() //--></script>", &$PageEndFmt));
+  PrintFmt($pagename,$AuthPromptFmt);
+  exit;
+}
+
+function IsAuthorized($chal, $source, &$from) {
+  global $AuthList, $AuthPw, $AllowPassword;
+  if (!$chal) return $from;
+  $auth = 0; 
+  $passwd = array();
+  foreach((array)$chal as $c) {
+    $x = '';
+    $pwchal = preg_split('/([, ]|\\w+:)/', $c, -1, PREG_SPLIT_DELIM_CAPTURE);
+    foreach($pwchal as $pw) {
+      if ($pw == ',' || $pw == '') continue;
+      else if ($pw == ' ') { $x = ''; continue; }
+      else if (substr($pw, -1, 1) == ':') { $x = $pw; continue; }
+      else if ($pw{0} != '@' && $x > '') $pw = $x . $pw;
+      if (!$pw) continue;
+      $passwd[] = $pw;
+      if ($auth < 0) continue;
+      if ($x || $pw{0} == '@') {
+        if (@$AuthList[$pw]) $auth = $AuthList[$pw];
+        continue;
+      }
+      if (crypt($AllowPassword, $pw) == $pw)           # nopass
+        { $auth=1; continue; }
+      foreach((array)$AuthPw as $pwresp)                       # password
+        if (crypt($pwresp, $pw) == $pw) { $auth=1; continue; }
+    }
+  }
+  if (!$passwd) return $from;
+  if ($auth < 0) $auth = 0;
+  return array($auth, $passwd, $source);
+}
+
+
+## SessionAuth works with PmWikiAuth to manage authorizations
+## as stored in sessions.  First, it can be used to set session
+## variables by calling it with an $auth argument.  It then
+## uses the authid, authpw, and authlist session variables
+## to set the corresponding values of $AuthId, $AuthPw, and $AuthList
+## as needed.
+function SessionAuth($pagename, $auth = NULL) {
+  global $AuthId, $AuthList, $AuthPw;
+  static $called;
+
+  @$called++;
+  if (!$auth && ($called > 1 || !@$_REQUEST[session_name()])) return;
+
+  $sid = session_id();
+  @session_start();
+  foreach((array)$auth as $k => $v)
+    if ($k) $_SESSION[$k] = (array)$v + (array)@$_SESSION[$k];
+
+  if (!isset($AuthId)) $AuthId = @end($_SESSION['authid']);
+  $AuthPw = array_keys((array)@$_SESSION['authpw']);
+  $AuthList = array_merge($AuthList, (array)@$_SESSION['authlist']);
+  if (!$sid) session_write_close();
+}
+
+
+function PasswdVar($pagename, $level) {
+  global $PCache, $PasswdVarAuth, $FmtV;
+  $page = $PCache[$pagename];
+  if (!isset($page['=passwd'][$level])) {
+    $page = RetrieveAuthPage($pagename, 'ALWAYS', false, READPAGE_CURRENT);
+    if ($page) PCache($pagename, $page);
+  }
+  SDV($PasswdVarAuth, 'attr');
+  if ($PasswdVarAuth && !@$page['=auth'][$PasswdVarAuth]) return '(protected)';
+  $pwsource = $page['=pwsource'][$level];
+  if (strncmp($pwsource, 'cascade:', 8) == 0) {
+    $FmtV['$PWCascade'] = substr($pwsource, 8);
+    return FmtPageName('$[(using $PWCascade password)]', $pagename);
+  }
+  $setting = implode(' ', preg_replace('/^(?!@|\\w+:).+$/', '****',
+                                       (array)$page['=passwd'][$level]));
+  if ($pwsource == 'group' || $pwsource == 'site') {
+    $FmtV['$PWSource'] = $pwsource;
+    $setting = FmtPageName('$[(set by $PWSource)] ', $pagename) . $setting;
+  }
+  return $setting;
+}
+
+
+function PrintAttrForm($pagename) {
+  global $PageAttributes, $PCache, $FmtV;
+  echo FmtPageName("<form action='\$PageUrl' method='post'>
+    <input type='hidden' name='action' value='postattr' />
+    <input type='hidden' name='n' value='\$FullName' />
+    <table>",$pagename);
+  $page = $PCache[$pagename];
+  foreach($PageAttributes as $attr=>$p) {
+    if (!$p) continue;
+    if (strncmp($attr, 'passwd', 6) == 0) {
+      $setting = PageVar($pagename, '$Passwd'.ucfirst(substr($attr, 6)));
+      $value = '';
+    } else { $setting = @$page[$attr]; $value = @$page[$attr]; }
+    $prompt = FmtPageName($p,$pagename);
+    echo "<tr><td>$prompt</td>
+      <td><input type='text' name='$attr' value='$value' /></td>
+      <td>$setting</td></tr>";
+  }
+  echo FmtPageName("</table><input type='submit' value='$[Save]' /></form>",
+         $pagename);
+}
+
+function HandleAttr($pagename, $auth = 'attr') {
+  global $PageAttrFmt,$PageStartFmt,$PageEndFmt;
+  $page = RetrieveAuthPage($pagename, $auth, true, READPAGE_CURRENT);
+  if (!$page) { Abort("?unable to read $pagename"); }
+  PCache($pagename,$page);
+  XLSDV('en', array('EnterAttributes' =>
+    "Enter new attributes for this page below.  Leaving a field blank
+    will leave the attribute unchanged.  To clear an attribute, enter
+    'clear'."));
+  SDV($PageAttrFmt,"<div class='wikiattr'>
+    <h2 class='wikiaction'>$[{\$FullName} Attributes]</h2>
+    <p>$[EnterAttributes]</p></div>");
+  SDV($HandleAttrFmt,array(&$PageStartFmt,&$PageAttrFmt,
+    'function:PrintAttrForm',&$PageEndFmt));
+  PrintFmt($pagename,$HandleAttrFmt);
+}
+
+function HandlePostAttr($pagename, $auth = 'attr') {
+  global $PageAttributes, $EnablePostAttrClearSession;
+  Lock(2);
+  $page = RetrieveAuthPage($pagename, $auth, true);
+  if (!$page) { Abort("?unable to read $pagename"); }
+  foreach($PageAttributes as $attr=>$p) {
+    $v = stripmagic(@$_POST[$attr]);
+    if ($v == '') continue;
+    if ($v=='clear') unset($page[$attr]);
+    else if (strncmp($attr, 'passwd', 6) != 0) $page[$attr] = $v;
+    else {
+      $a = array();
+      preg_match_all('/"[^"]*"|\'[^\']*\'|\\S+/', $v, $match);
+      foreach($match[0] as $pw) 
+        $a[] = preg_match('/^(@|\\w+:)/', $pw) ? $pw 
+                   : crypt(preg_replace('/^([\'"])(.*)\\1$/', '$2', $pw));
+      if ($a) $page[$attr] = implode(' ',$a);
+    }
+  }
+  WritePage($pagename,$page);
+  Lock(0);
+  if (IsEnabled($EnablePostAttrClearSession, 1)) {
+    @session_start();
+    unset($_SESSION['authid']);
+    unset($_SESSION['authlist']);
+    $_SESSION['authpw'] = array();
+  }
+  Redirect($pagename);
+  exit;
+} 
+
+
+function HandleLogoutA($pagename, $auth = 'read') {
+  global $LogoutRedirectFmt, $LogoutCookies;
+  SDV($LogoutRedirectFmt, '$FullName');
+  SDV($LogoutCookies, array());
+  @session_start();
+  $_SESSION = array();
+  if (isset($_COOKIE[session_name()]))
+    setcookie(session_name(), '', time()-43200, '/');
+  foreach ($LogoutCookies as $c)
+    if (isset($_COOKIE[$c])) setcookie($c, '', time()-43200, '/');
+  session_destroy();
+  Redirect(FmtPageName($LogoutRedirectFmt, $pagename));
+}
+
+
+function HandleLoginA($pagename, $auth = 'login') {
+  global $AuthId, $DefaultPasswords;
+  unset($DefaultPasswords['admin']);
+  $prompt = @(!$_POST['authpw'] || ($AuthId != $_POST['authid']));
+  $page = RetrieveAuthPage($pagename, $auth, $prompt, READPAGE_CURRENT);
+  Redirect($pagename);
+}
+


Property changes on: trunk/oggdsf/website/pmwiki.php
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/oggdsf/website/pub/guiedit/README
===================================================================
--- trunk/oggdsf/website/pub/guiedit/README	                        (rev 0)
+++ trunk/oggdsf/website/pub/guiedit/README	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,6 @@
+The images in this directory are part of the GUIEdit module
+for PmWiki, Copyright 2005-2006 Patrick R. Michaud (pmichaud at pobox.com)
+These images are part of PmWiki; you can redistribute it and/or modify
+them under the terms of the GNU General Public License as published
+by the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.  See pmwiki.php for full details.

Added: trunk/oggdsf/website/pub/guiedit/attach.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/attach.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/big.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/big.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/blank.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/blank.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/center.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/center.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/em.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/em.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/extlink.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/extlink.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/guiedit.js
===================================================================
--- trunk/oggdsf/website/pub/guiedit/guiedit.js	                        (rev 0)
+++ trunk/oggdsf/website/pub/guiedit/guiedit.js	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,62 @@
+/*  Copyright 2004 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This file provides Javascript functions to support WYSIWYG-style
+    editing.  The concepts are borrowed from the editor used in Wikipedia,
+    but the code has been rewritten from scratch to integrate better with
+    PHP and PmWiki's codebase.  
+*/
+
+function insButton(mopen, mclose, mtext, mlabel, mkey) {
+  if (mkey > '') { mkey = 'accesskey="' + mkey + '" ' }
+  document.write("<a " + mkey + "href=\"javascript:insMarkup('"
+    + mopen + "','"
+    + mclose + "','"
+    + mtext + "');\">"
+    + mlabel + "</a>");
+}
+
+function insMarkup(mopen, mclose, mtext) {
+  var tarea = document.getElementById('text');
+  if (tarea.setSelectionRange > '') {
+    var p0 = tarea.selectionStart;
+    var p1 = tarea.selectionEnd;
+    var top = tarea.scrollTop;
+    var str = mtext;
+    var cur0 = p0 + mopen.length;
+    var cur1 = p0 + mopen.length + str.length;
+    while (p1 > p0 && tarea.value.substring(p1-1, p1) == ' ') p1--; 
+    if (p1 > p0) {
+      str = tarea.value.substring(p0, p1);
+      cur0 = p0 + mopen.length + str.length + mclose.length;
+      cur1 = cur0;
+    }
+    tarea.value = tarea.value.substring(0,p0)
+      + mopen + str + mclose
+      + tarea.value.substring(p1);
+    tarea.focus();
+    tarea.selectionStart = cur0;
+    tarea.selectionEnd = cur1;
+    tarea.scrollTop = top;
+  } else if (document.selection) {
+    var str = document.selection.createRange().text;
+    tarea.focus();
+    range = document.selection.createRange()
+    if (str == '') {
+      range.text = mopen + mtext + mclose;
+      range.moveStart('character', -mclose.length - mtext.length );
+      range.moveEnd('character', -mclose.length );
+    } else {
+      if (str.charAt(str.length - 1) == " ") {
+        mclose = mclose + " ";
+        str = str.substr(0, str.length - 1);
+      }
+      range.text = mopen + str + mclose;
+    }
+    range.select();
+  } else { tarea.value += mopen + mtext + mclose; }
+  return;
+}

Added: trunk/oggdsf/website/pub/guiedit/h.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/h.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/h1.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/h1.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/h2.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/h2.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/h3.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/h3.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/hr.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/hr.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/indent.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/indent.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/left.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/left.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/math.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/math.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/ol.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/ol.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/outdent.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/outdent.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/pagelink.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/pagelink.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/preview.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/preview.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/right.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/right.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/save.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/save.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/small.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/small.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/spellcheck.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/spellcheck.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/strong.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/strong.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/sub.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/sub.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/sup.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/sup.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/table.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/table.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/ul.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/ul.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/guiedit/underline.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/guiedit/underline.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/skins/barthelme/barthelme.css
===================================================================
--- trunk/oggdsf/website/pub/skins/barthelme/barthelme.css	                        (rev 0)
+++ trunk/oggdsf/website/pub/skins/barthelme/barthelme.css	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,234 @@
+/*  
+NAME: barthelme.css
+AUTHOR: Chi Shang Cheng <chengsta at chengsta com>
+CREATED: 2007-01-07
+DESCRIPTION: This is a port of the Barthelme Wordpress theme for PmWiki.
+ORIGINAL AUTHOR: Scott Allan Wallick
+ORIGINAL AUTHOR URI: http://scottwallick.com/
+*/
+/*
+"Barthelme" (C) 2006 Scott Allan Wallick - http://scottwallick.com/ - and distributed under the terms of the GNU General Public License v2
+*/
+html, body {
+	margin: 0;
+	padding: 0;
+}
+body {
+	background-color: #fff;
+	color: #222;
+	line-height: 150%;
+}
+/* GLOBAL ELEMENT COMBINATIONS */
+div#sidebar ul li h2 {
+	background: #fff;
+	color: #888;
+}
+div#content blockquote, div#content h1, div#content h2, div#content h4,div#content h5, div#content h6, div#sidebar ul li p {
+	background: #fff;
+	color: #444;
+}
+/* HEADER STUFF */
+div#header {
+	background: #bac8da url(./images/header.png) repeat-x top center;
+	color: #f5f5f5;
+	margin: 3em 0;
+	padding: 1.2em 0 1.2em 3em;
+}
+h1#title {
+	font-size: 2.2em;
+	font-weight: normal;
+	line-height: normal;
+	margin: 0;
+}
+p#description {
+	font-size: 1.3em;
+	margin: 0;
+}
+/* WRAPPER - CONTAINER - CONTENT STUFF */
+div#container {
+	float: right;
+	width: 100%;
+	margin: 0 0 0 -20em;
+}
+div.narrowcolumn {
+	margin: 0 0 0 19.5em;
+	padding: 0 2% 0 1%;
+}
+div.widecolumn {
+	margin: 0 0 0 19em;
+	padding: 0 4% 0 2%;
+}
+div#content h2 {
+	font-size: 1.7em;
+	font-weight: normal;
+	margin: 0.3em 0 1em 0;
+}
+div#content h3 {
+	font-size: 1.1em;
+	color: #888;
+	margin: 0;
+}
+div#content p {
+	line-height: 150%;
+	margin: 1em 0;
+}
+div#content ul li { list-style: square; }
+div#content ul li, div#content ol li { line-height: 150%; }
+div#content blockquote {
+	border-left: 1em solid #cfd5dd;
+	font-size: 0.9em;
+	padding-left: 1em;
+}
+div#content hr {
+	border: 0;
+	border-bottom: 1px solid #888;
+	margin: 1em 0 1em 0;
+}
+/* SIDEBAR STUFF */
+div#sidebar {
+	float: left;
+	width: 16em;
+}
+div#sidebar ul {
+	margin: 0 1.5em 0 3em;
+	padding: 0;
+}
+div#sidebar ul li {
+	font-size: 1em;
+	line-height: 175%;
+	list-style: none;
+	margin: 0 0 1.5em 0;
+	padding: 0;
+}
+div#sidebar ul li h2 {
+	font-size: 1em;
+	margin: 0;
+	text-transform: uppercase;
+}
+div#sidebar ul li, div#sidebar ul li ul, div#sidebar ul li ul li {
+	margin: 0;
+	padding: 0;
+}
+div#sidebar ul li ul li ul li {
+	font-size: 0.9em;
+	margin: 0 0 0 1em;
+}
+/* FOOTER STUFF */
+div#footer {
+	background: #fff;
+	clear: both;
+	color: #888;
+	padding: 5em 0 1em 3em;
+}
+div#footer p {
+	font-size: 0.9em;
+	margin: 0;
+}
+/* GLOBAL ALIGNMENT AND MISC ELEMENTS */
+.alignleft { float: left; }
+.alignright  { float: right; }
+abbr, acronym {
+	border-bottom: 1px dotted #546188;
+	cursor: help;
+}
+code, pre {
+	font: 1em/normal "courier new", courier, monospace;
+}
+.clearer {
+	clear: both;
+	height: 0;
+}
+/* IMAGE ELEMENTS, INCLUDING LINKS */
+img { border: none; }
+div#content img.center {
+	display: block;
+	margin: 0.4em auto;
+}
+div#content img.alignright { margin: 0.4em 0 0.4em 1.1em }
+div#content img.alignleft { margin: 0.4em 1.1em 0.4em 0; }
+/* FORMS FOR COMMENTS AND SEARCH / INCLUDES STYLES FOR THE WP-CONTACTFORM PLUGIN */
+div.formcontainer p{
+	margin: 0.5em 0 1em 0;
+}
+form {
+	margin: 0.3em 0 0 0;
+	padding: 0;
+}
+input#s {
+	margin: 0 0 0.4em 0;
+	padding: 0.2em;
+	width: 70%;
+}
+textarea {
+	/* height: 13em; */
+	overflow: auto;
+	float: left;
+	width: 100%;
+	margin: 0 0 0.5em 0;
+}
+input#searchsubmit, input#submit, input.e_button { border: 1px outset #999; }
+input#s, input#summary, input#author { width: 66%; }
+input#s, input#summary, input#author, textarea {
+	border: 1px inset #999;
+	padding: 0.2em;
+}
+div.formcontainer {
+	font-size: 1em;
+	margin: 0 0 3em 0;
+	width: 100%;
+}
+span.formright, span.formleft {
+	display: inline;
+	float: left;
+	margin: 0 0 0.5em 0;
+}
+span.formleft {
+	clear: both;
+	text-align: right;
+	width: 15%;
+	margin: 0 2% 0 0;
+}
+span.formright { width: 80%; }
+/* LINK STYLES */
+div#header a, div#header a:active, div#header a:link, div#header a:visited {
+	background: transparent;
+	color: #fff;
+	text-decoration: none;
+}
+div#header a:hover {
+	background: transparent;
+	color: #e5e5e5;
+}
+div#content a, div#content a:active, div#content a:link, div#content a:visited {
+	color: #546188;
+	background: transparent;
+}
+div#content a:hover {
+	color: #000;
+	background: transparent;
+}
+div#sidebar a, div#sidebar a:active, div#sidebar a:link, div#sidebar a:visited {
+	background: #fff;
+	color: #999;
+	text-decoration: none;
+}
+div#sidebar a:hover {
+	background: #fff;
+	color: #2f4e6f;
+	text-decoration: underline;
+}
+div#footer a, div#footer a:active, div#footer a:link, div#footer a:visited {
+	background: #fff;
+	color: #888;
+}
+div#footer a:hover {
+	background: #fff;
+	color: #222;
+	text-decoration: none;
+}
+
+.sidehead {
+  font-size:11pt; font-weight:bold; font-style:normal;
+}
+.sidehead a
+  { color:#505050; font-weight:bold; font-style:normal; }

Added: trunk/oggdsf/website/pub/skins/barthelme/barthelme.php
===================================================================
--- trunk/oggdsf/website/pub/skins/barthelme/barthelme.php	                        (rev 0)
+++ trunk/oggdsf/website/pub/skins/barthelme/barthelme.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,100 @@
+<?php if (!defined('PmWiki')) exit();
+
+/************************************************************************************
+ * FUNCTION DEFAULTS
+ ************************************************************************************/
+
+global $barthelme_bodyfontsize;
+global $barthelme_bodyfontfamily;
+global $barthelme_headerfontfamily;
+global $barthelme_postentryalignment;
+global $barthelme_wrapperwidth;
+global $barthelme_sidebartext;
+
+global $barthelme_sidebar_visible, $EnableMenuBar;
+
+if ($EnableMenuBar != 1) {
+	$barthelme_sidebar_visible = "style=\"display: none;\"";
+}
+
+$barthelme_sidebartext_visible = FALSE;
+
+/************************************************************************************
+ * FUNCTION CALLS
+ ************************************************************************************/
+
+function barthelme_bodyfontsize() {
+	if (isset($barthelme_bodyfontsize)) {
+		print 'body { font-size: ';
+		print $barthelme_bodyfontsize;
+		print "; }\n";
+	}
+	else {
+		print 'body { font-size: ';
+		print '75%';
+		print "; }\n";
+	}
+}
+
+function barthelme_bodyfontfamily() {
+	if (isset($barthelme_bodyfontfamily)) {
+		print 'body { font-family: ';
+		print $barthelme_bodyfontfamily;
+		print "; }\n";
+	}
+	else {
+		print 'body { font-family: ';
+		print 'arial, helvetica, sans-serif';
+		print "; }\n";
+	}
+}	
+
+function barthelme_headerfontfamily() {
+	if (isset($barthelme_headerfontfamily)) {
+		print 'div.post-header, h2.post-title, p.post-date-single, h2.post-title-single, div.post-entry h1, div.post-entry h2, div.post-entry h3, div.post-entry h4, div.post-entry h5, div.post-entry h6, div.post-entry blockquote, div.post-footer, h3#comment-count, h4#comment-header, div#comments ol li p.comment-metadata, h4#respond { font-family: ';
+		print $barthelme_headerfontfamily;
+		print "; }\n";
+	}
+	else {
+		print 'div#content h1, div#content h2 { font-family: ';
+		print 'georgia, times, serif';
+		print "; }\n";
+	}	
+}
+
+function barthelme_postentryalignment() {
+	if (isset($barthelme_postentryalignment)) {
+		print 'div#content p { text-align: ';
+		print $barthelme_postentryalignment;
+		print "; }\n";
+	}
+	else {
+		print 'div#content p { text-align: ';
+		print 'left';
+		print "; }\n";
+	}
+	
+}
+
+function barthelme_wrapperwidth() {
+	if (isset($barthelme_wrapperwidth)) {
+		print 'div#wrapper { width: ';
+		print $barthelme_wrapperwidth;
+		print "; }\n";
+	}
+	else {
+		print 'div#wrapper { width: ';
+		print '90%';
+		print "; }\n";
+	}
+}
+
+function barthelme_sidebartext() {
+	if (empty($barthelme_sidebartext) && $barthelme_sidebartext_visible) {
+		print '<li><h2>About</h2><p>Lorem ipusm text here can be customized in the <em>Presentation > blog.txt Themes Options</em> menu. You can also select within the options to exclude this section completely. <em>Most</em> XHTML <strong>tags</strong> will <span style="text-decoration:underline;">work</span>.</p></li>';
+	}
+}
+
+function barthelme_copyrightyear() {
+	print date("Y");
+}

Added: trunk/oggdsf/website/pub/skins/barthelme/barthelme.tmpl
===================================================================
--- trunk/oggdsf/website/pub/skins/barthelme/barthelme.tmpl	                        (rev 0)
+++ trunk/oggdsf/website/pub/skins/barthelme/barthelme.tmpl	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,79 @@
+<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
+<html xmlns='http://www.w3.org/1999/xhtml'>
+<head profile='http://gmpg.org/xfn/11'>
+	<title>$WikiTitle :: {$Group} / {$Title} $ActionTitle</title>
+	<meta http-equiv='Content-Style-Type' content='text/css' />
+  <meta name="description" content="Directshow Ogg demuxer/muxer with vorbis, speex, FLAC and theora decoders and encoders.">
+  <meta name="keywords" content="directshow, theora, vorbis, speex, ogg, media player, flac, codec, windows, audio, video, wmp, directX, plugin, plug-in, decoder, encoder, demux, mux, demuxer">
+	<link rel='stylesheet' title='Barthelme' href='$SkinDirUrl/barthelme.css' type='text/css' media='all' />
+	<link rel='start' href='{$ScriptUrl}' title='$WikiTitle' />
+	<style type='text/css' media='all'>
+		<!--function:barthelme_bodyfontsize-->
+		<!--function:barthelme_bodyfontfamily-->
+		<!--function:barthelme_headerfontfamily-->
+		<!--function:barthelme_postentryalignment-->
+		<!--function:barthelme_wrapperwidth-->
+	</style>
+	<!--HTMLHeader-->
+</head>
+<body>
+<div id='wrapper'>
+<!--PageHeaderFmt-->
+	<div id='header' onclick='location.href="{$ScriptUrl}";' style='cursor:pointer;'>
+	  <div id='logo' style='float:right;'><img src='$PageLogoUrl'/></div>
+		<h1 id='title'><a href='{$ScriptUrl}' title='$WikiTitle'>$WikiTitle</a></h1>
+		<p id='description'><a href='{$ScriptUrl}/{$Group}'>{$Group}</a> / <a href='{$ScriptUrl}/{$Group}.{$Title}'>{$Title}</a></p>
+	</div>
+<!--/PageHeaderFmt-->
+
+<div id='container'>
+	<div id='content' class='widecolumn'>
+	<!--PageText-->
+	</div>
+</div>
+
+<!--PageLeftFmt-->
+<div id='sidebar' $barthelme_sidebar_visible>
+	<ul>
+		<!--function:barthelme_sidebartext-->
+		<li>
+			<!--wiki:Site.SideBar-->
+		</li>
+		<li id='search'>
+			<h2><label for='s'>Search</label></h2>
+			<form id='searchform' action='{$ScriptUrl}'>
+			<div>
+				<input type='hidden' name='n' value='{$FullName}' />
+    				<input type='hidden' name='action' value='search' />
+				<input id='s' name='q' type='text' value='' tabindex='1' size='10' />
+				<br />
+				<input id='searchsubmit' name='searchsubmit' type='submit' value='Find' tabindex='2' />
+			</div>
+			</form><br/>
+		</li>
+		<li>
+			<h2>Actions</h2>
+			<!--wiki:Site.PageActions-->
+		</li>
+	</ul>
+</div>
+<!--/PageLeftFmt-->
+
+	<div id='footer'>
+		<p>
+			&copy; <!--function:barthelme_copyrightyear--> Administrator
+			|
+			Powered by <a href='http://www.pmwiki.com/' title='PmWiki'>PmWiki</a>
+			|
+			<a href='http://www.plaintxt.org/themes/barthelme/' title='Barthelme for WordPress' rel='follow'>Barthelme</a> theme by <a href='http://scottwallick.com/' title='scottwallick.com' rel='follow'>Scott</a> and ported by <a href='http://cscheng.info/blog'>Chi Shang</a>
+			|
+			Valid <a href='http://validator.w3.org/check?uri={$ScriptUrl}&amp;outline=1&amp;verbose=1' title='Valid XHTML 1.0 Strict' rel='nofollow'>XHTML</a> &amp; <a href='http://jigsaw.w3.org/css-validator/validator?uri=$SkinDirUrl/barthelme.css&amp;profile=css2&amp;warning=no' title='Valid CSS' rel='nofollow'>CSS</a>
+		</p>
+	</div>
+
+</div>
+
+<!-- The 'Barthelme' theme copyright (c) 2006 Scott Allan Wallick - http://www.plaintxt.org/themes/ -->
+
+</body>
+</html>

Added: trunk/oggdsf/website/pub/skins/barthelme/images/bk.png
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/skins/barthelme/images/bk.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/skins/barthelme/images/feed.png
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/skins/barthelme/images/feed.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/skins/barthelme/images/header.png
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/skins/barthelme/images/header.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/skins/pmwiki/README
===================================================================
--- trunk/oggdsf/website/pub/skins/pmwiki/README	                        (rev 0)
+++ trunk/oggdsf/website/pub/skins/pmwiki/README	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,22 @@
+This directory contains the files to display pages in PmWiki according
+to the default layout.  
+
+==>Don't edit these files directly, as you may lose your edits the
+next time you upgrade PmWiki!
+
+Instead, copy the files to another directory in pub/skins/ and edit
+them there.  You can then configure PmWiki to use your modified layout
+files by setting the $Skin variable in your local/config.php.  For 
+example, if you copy your custom skin to pub/skins/custom, then you 
+would set
+   $Skin = 'custom';
+in local/config.php.
+
+The files in this directory:
+    pmwiki.tmpl   -- the default template for page layouts
+    pmwiki.css    -- PmWiki's default css
+    pmwiki-32.gif -- the PmWiki logo
+
+If you just want to change the logo, you can do it by setting $PageLogoUrl
+to the url location of your logo.
+

Added: trunk/oggdsf/website/pub/skins/pmwiki/pmwiki-32.gif
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/pub/skins/pmwiki/pmwiki-32.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/pub/skins/pmwiki/pmwiki.css
===================================================================
--- trunk/oggdsf/website/pub/skins/pmwiki/pmwiki.css	                        (rev 0)
+++ trunk/oggdsf/website/pub/skins/pmwiki/pmwiki.css	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,102 @@
+/***********************************************************************
+** pmwiki.css
+**  Copyright 2004-2006 Patrick R. Michaud (pmichaud at pobox.com)
+**  Copyright 2006 Hagan Fox
+**  This file is part of PmWiki; you can redistribute it and/or modify
+**  it under the terms of the GNU General Public License as published
+**  by the Free Software Foundation; either version 2 of the License, or
+**  (at your option) any later version.  See pmwiki.php for full details.
+***********************************************************************/
+
+/* This sets the overall frame for the site */
+body {
+  margin:0px; background-color:#f7f7f7; 
+  font-family:Arial,Helvetica,sans-serif; font-size:11pt;
+}
+
+/* These control the fixed-width text elements of the page */
+textarea, pre, code { font-size:0.9em; }
+pre, code { font-family:'Lucida Console','Andale Mono','Courier New',Courier,monospace; }
+pre { line-height:1.2em; }
+pre code, code code, pre pre { font-size:100%; }
+
+/* These primarily adjust the size and spacing of heading elements,
+** most browsers have atrocious defaults for these. */
+h1, h2, h3, h4, h5, h6 { margin-top:1.0em; margin-bottom:0.6em; }
+h1, h2, h3, h6 { font-weight:normal; }
+h4, h5 { font-weight:bold; }
+h1 code, h2 code, h3 code, h4 code { font-size:1em; }
+h1 { font-size:1.8em; }
+h2 { font-size:1.44em; }
+h3 { font-size:1.22em; }
+h4 { font-size:1.07em; }
+h5 { font-size:1.0em; }
+h6 { font-size:1.0em; }
+
+/* The #wikilogo element is the logo from $PageLogoFmt */
+#wikilogo { margin-top:4px; padding:6px; border-bottom:1px #cccccc solid; }
+
+/* This controls the rest of the heading (primarily the search box) */
+#wikihead { 
+  position:absolute; right:10px; top:10px; 
+  font-family:Verdana,sans-serif; font-size:85%; 
+}
+#wikihead input { font-size:85%; } 
+
+/* These are for the left-sidebar. */
+#wikileft { 
+  width:155px; 
+  padding:6px; border-right:1px #cccccc solid; 
+  line-height:1.33em;
+  font-size:9.4pt; font-family:Verdana,sans-serif;
+}
+#wikileft .vspace { margin-top:1.125em; }
+#wikileft a { text-decoration:none; color:black; }
+#wikileft a:hover { text-decoration:underline; color:blue; }
+#wikileft ul { list-style:none; padding:0px; margin:0px; }
+#wikileft li { margin:0px; padding-left: 6px; }
+.sidehead {
+  margin:0px; padding:4px 2px 2px 2px;
+  font-size:11pt; font-weight:bold; font-style:normal; 
+}
+.sidehead a 
+  { color:#505050; font-weight:bold; font-style:normal; }
+
+/* These affect the main content area. */
+#wikibody { 
+  padding:0px 10px 10px 10px; background-color:white; 
+  font-size:11pt; 
+}
+#wikicmds { 
+  float:right; white-space:nowrap; 
+  font-family:Verdana,sans-serif; font-size:80%; 
+}
+#wikicmds ul { list-style:none; margin:0px; padding:0px; }
+#wikicmds li { display:inline; margin:0px 5px; }
+#wikicmds li a { text-decoration:none; color:black; border:none; }
+#wikicmds li a.createlink { display:none; }
+#wikicmds li a:hover { text-decoration:underline; color:blue; }
+.pagegroup { margin-top:8px; margin-bottom:2px; }
+.pagetitle { line-height:1em; margin:0px; font-size:1.6em; font-weight:normal; }
+.wikiaction { margin-top:4px; margin-bottom:4px; }
+#wikitext { margin-top:12px; line-height:1.33em; }
+#wikitext table { font-size:100%; line-height:1.33em; } /* For MSIE 5.5 */
+
+/* These are for the edit form. */
+#wikiedit form { margin:0px; width:100%; }
+#wikiedit textarea { width:100%; }
+.wikimessage { margin-top:4px; margin-bottom:4px; font-style:italic; }
+
+/* These affect the lines at the very bottom. */
+#wikifoot { 
+  padding-left:178px; padding-bottom:4px; border-top:1px #cccccc solid;
+  font-family:Verdana,sans-serif; font-size:80%; 
+}
+
+/* These affect the printed appearance of the web view (not the separate
+** print view) of pages.  The sidebar and action links aren't printed. */
+ at media print {
+  body { width:auto; margin:0px; padding:0.5em; }
+  #wikihead, #wikileft, #wikicmds, .footnav { display:none; }
+  #wikifoot { padding:2px; }
+}

Added: trunk/oggdsf/website/pub/skins/pmwiki/pmwiki.tmpl
===================================================================
--- trunk/oggdsf/website/pub/skins/pmwiki/pmwiki.tmpl	                        (rev 0)
+++ trunk/oggdsf/website/pub/skins/pmwiki/pmwiki.tmpl	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,52 @@
+<!DOCTYPE html 
+    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+  <title>$WikiTitle | {$Group} / {$Title} $ActionTitle</title>
+  <meta http-equiv='Content-Style-Type' content='text/css' />
+  <link rel='stylesheet' href='$SkinDirUrl/pmwiki.css' type='text/css' />
+  <!--HTMLHeader-->
+</head>
+<body>
+<!--PageHeaderFmt-->
+  <div id='wikilogo'><a href='{$ScriptUrl}'><img src='$PageLogoUrl'
+    alt='$WikiTitle' border='0' /></a></div>
+  <div id='wikihead'>
+  <form action='{$ScriptUrl}'>
+    <span class='headnav'><a href='{$ScriptUrl}/$[{$Group}/RecentChanges]'
+      accesskey='$[ak_recentchanges]'>$[Recent Changes]</a> -</span>
+    <input type='hidden' name='n' value='{$FullName}' />
+    <input type='hidden' name='action' value='search' />
+    <a href='{$ScriptUrl}/$[{$SiteGroup}/Search]'>$[Search]</a>:
+    <input type='text' name='q' value='' class='inputbox searchbox' />
+    <input type='submit' class='inputbutton searchbutton'
+      value='$[Go]' /></form></div>
+<!--/PageHeaderFmt-->
+  <table id='wikimid' width='100%' cellspacing='0' cellpadding='0'><tr>
+<!--PageLeftFmt-->
+      <td id='wikileft' valign='top'>
+        <!--wiki:{$Group}.SideBar {$SiteGroup}.SideBar--></td>
+<!--/PageLeftFmt-->
+      <td id='wikibody' valign='top'>
+<!--PageActionFmt-->
+        <div id='wikicmds'><!--wiki:{$Group}.PageActions {$SiteGroup}.PageActions--></div>
+<!--PageTitleFmt-->
+        <div id='wikititle'>
+          <div class='pagegroup'><a href='{$ScriptUrl}/{$Group}'>{$Group}</a> /</div>
+          <h1 class='pagetitle'>{$Title}</h1></div>
+<!--PageText-->
+      </td>
+    </tr></table>
+<!--PageFooterFmt-->
+  <div id='wikifoot'>
+    <div class='footnav'>
+      <a rel="nofollow" href='{$PageUrl}?action=edit'>$[Edit]</a> -
+      <a rel="nofollow" href='{$PageUrl}?action=diff'>$[History]</a> -
+      <a rel="nofollow" href='{$PageUrl}?action=print' target='_blank'>$[Print]</a> -
+      <a href='{$ScriptUrl}/$[{$Group}/RecentChanges]'>$[Recent Changes]</a> -
+      <a href='{$ScriptUrl}/$[{$SiteGroup}/Search]'>$[Search]</a></div>
+    <div class='lastmod'>$[Page last modified on {$LastModified}]</div></div>
+<!--HTMLFooter-->
+</body>
+</html>

Added: trunk/oggdsf/website/pub/skins/print/README
===================================================================
--- trunk/oggdsf/website/pub/skins/print/README	                        (rev 0)
+++ trunk/oggdsf/website/pub/skins/print/README	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,20 @@
+This directory contains the files to print pages in PmWiki for ?action=print.
+This is a template just like any other layout skin, except that for
+?action=print PmWiki looks for print.tmpl instead of screen.tmpl.
+
+==>Don't edit these files directly, as you may lose your edits the
+next time you upgrade PmWiki!
+
+Instead, copy the files to another directory in pub/skins/ and edit
+them there.  You can then configure PmWiki to use your modified layout
+files by setting $ActionSkin['print'] to the name of your new skin.
+For example, if you copy your custom print skin to pub/skins/custom, 
+then you would set
+   $ActionSkin['print'] = 'custom';
+in local/config.php.
+
+The files in this directory:
+    print.tmpl    -- the default template for ?action=print
+    print.css     -- the print template's css
+    print.php     -- loaded when the skin is loaded, it redefines the link
+                     formats to a form better suited for printing

Added: trunk/oggdsf/website/pub/skins/print/print.css
===================================================================
--- trunk/oggdsf/website/pub/skins/print/print.css	                        (rev 0)
+++ trunk/oggdsf/website/pub/skins/print/print.css	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,50 @@
+/***********************************************************************
+** print.css
+**  Copyright 2004 Patrick R. Michaud (pmichaud at pobox.com)
+**  This file is part of PmWiki; you can redistribute it and/or modify
+**  it under the terms of the GNU General Public License as published
+**  by the Free Software Foundation; either version 2 of the License, or
+**  (at your option) any later version.  See pmwiki.php for full details.
+***********************************************************************/
+
+/***********************************************************************
+** These settings are part of the ?action=print skin.  If you want
+** to change these settings, create a new print template and set
+** $PrintTemplateFmt in the config.php file to point to your new 
+** printing skin.
+***********************************************************************/
+
+body { 
+  width:auto;
+  background-color:white;
+  color:black;
+  font-family:serif;
+}
+
+#printhead { 
+  font-family:sans-serif;
+  border-top:3px solid #a0a0a0; 
+  border-bottom:5px solid #a0a0a0; 
+  margin-bottom:1em; 
+}
+#printhead h3 { margin-top:0px; } 
+#printhead h1 { margin-bottom:0px; }
+
+#printtitle { 
+}
+
+#printfoot {
+  clear:both;
+  margin-top:1em; 
+  border-top:5px solid #a0a0a0; 
+  font-size:smaller; 
+}
+
+  
+a:link { color:#444444; font-weight:bold; text-decoration:none; }
+a:visited { color:#444444; font-weight:bold; text-decoration:none; }
+a.wikilink:hover { color: #444444; text-decoration:underline; }
+a.createlink { color:#444444; }
+a.createlink:visited { color:#444444; }
+a.createlink:hover { color:#ff2222; }
+

Added: trunk/oggdsf/website/pub/skins/print/print.php
===================================================================
--- trunk/oggdsf/website/pub/skins/print/print.php	                        (rev 0)
+++ trunk/oggdsf/website/pub/skins/print/print.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,29 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2004 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This script defines additional settings needed when the 'print'
+    skin is loaded (usually in response to ?action=print, as controlled
+    by the $ActionSkin['print'] setting.  See scripts/skins.php for
+    more details.
+
+    The changes made are:
+      - Redefines the standard layout to a format suitable for printing
+      - Redefines internal links to keep ?action=print
+      - Changes the display of URL and mailto: links
+      - Uses GroupPrintHeader and GroupPrintFooter pages instead
+        of GroupHeader and GroupFooter
+*/
+
+global $LinkPageExistsFmt, $GroupPrintHeaderFmt, 
+  $GroupPrintFooterFmt, $GroupHeaderFmt, $GroupFooterFmt;
+
+$LinkPageExistsFmt = "<a class='wikilink' href='\$PageUrl?action=print'>\$LinkText</a>";
+SDV($GroupPrintHeaderFmt,'(:include $Group.GroupPrintHeader:)(:nl:)');
+SDV($GroupPrintFooterFmt,'(:nl:)(:include $Group.GroupPrintFooter:)');
+$GroupHeaderFmt = $GroupPrintHeaderFmt;
+$GroupFooterFmt = $GroupPrintFooterFmt;
+

Added: trunk/oggdsf/website/pub/skins/print/print.tmpl
===================================================================
--- trunk/oggdsf/website/pub/skins/print/print.tmpl	                        (rev 0)
+++ trunk/oggdsf/website/pub/skins/print/print.tmpl	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,20 @@
+<!DOCTYPE html 
+    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head>
+  <title>$WikiTitle | {$Group} / {$Title}</title>
+  <link rel='stylesheet' href='$SkinDirUrl/print.css' type='text/css' />
+  <!--HTMLHeader-->
+</head>
+<body>
+  <div id='printhead'>
+    <h3>$[From $WikiTitle]</h3>
+    <h1 class='pagename'><a href='$ScriptUrl/{$Group}'>{$Group}: {$Title}</a></h1>
+  </div>
+<!--PageText-->
+  <div id='printfoot'>
+    <div class='from'>$[Retrieved from {$PageUrl}]</div>
+    <div class='lastmod'>$[Page last modified on {$LastModified}]</div></div>
+<!--HTMLFooter-->
+</body>
+</html>

Added: trunk/oggdsf/website/scripts/.htaccess
===================================================================
--- trunk/oggdsf/website/scripts/.htaccess	                        (rev 0)
+++ trunk/oggdsf/website/scripts/.htaccess	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,12 @@
+# This file is cookbook/.htaccess -- the default distribution contains this
+# file to prevent cookbook/ scripts from being accessed directly by browsers
+# (this is a potential, albeit very unlikely, security hole).
+#
+# If you alter or replace this file, it will likely be overwritten when
+# you upgrade from one version of PmWiki to another.  Be sure to save
+# a copy of your alterations in another location so you can restore them,
+# and you might try changing this file to be read-only to prevent a PmWiki
+# upgrade from overwriting your altered version.
+
+Order Deny,Allow
+Deny from all

Added: trunk/oggdsf/website/scripts/author.php
===================================================================
--- trunk/oggdsf/website/scripts/author.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/author.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,55 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2004-2006 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This script handles author tracking.
+*/
+
+SDV($AuthorNameChars, "- '\\w\\x80-\\xff");
+SDV($AuthorCookie, $CookiePrefix.'author');
+SDV($AuthorCookieExpires,$Now+60*60*24*30);
+SDV($AuthorCookieDir,'/');
+SDV($AuthorGroup,'Profiles');
+SDV($AuthorRequiredFmt,
+  "<h3 class='wikimessage'>$[An author name is required.]</h3>");
+Markup('[[~','<links','/\\[\\[~(.*?)\\]\\]/',"[[$AuthorGroup/$1]]");
+
+$LogoutCookies[] = $AuthorCookie;
+
+if (!isset($Author)) {
+  if (isset($_POST['author'])) {
+    $x = stripmagic($_POST['author']);
+    setcookie($AuthorCookie, $x, $AuthorCookieExpires, $AuthorCookieDir);
+  } elseif (@$_COOKIE[$AuthorCookie]) {
+    $x = stripmagic(@$_COOKIE[$AuthorCookie]);
+  } else $x = @$AuthId;
+  $Author = htmlspecialchars(preg_replace("/[^$AuthorNameChars]/", '', $x), 
+                ENT_QUOTES);
+}
+if (!isset($AuthorPage)) $AuthorPage = 
+    FmtPageName('$AuthorGroup/$Name', MakePageName($pagename, $Author));
+SDV($AuthorLink,($Author) ? "[[~$Author]]" : '?');
+
+if (IsEnabled($EnableAuthorSignature,1)) {
+  SDVA($ROSPatterns, array(
+    '/(?<!~)~~~~(?!~)/e' 
+      => "FmtPageName('[[~\$Author]] \$CurrentTime', \$pagename)",
+    '/(?<!~)~~~(?!~)/e' 
+      => "FmtPageName('[[~\$Author]]', \$pagename)"));
+  Markup('~~~~','<links','/(?<!~)~~~~(?!~)/',"[[~$Author]] $CurrentTime");
+  Markup('~~~','>~~~~','/(?<!~)~~~(?!~)/',"[[~$Author]]");
+}
+if (IsEnabled($EnablePostAuthorRequired,0))
+  array_unshift($EditFunctions,'RequireAuthor');
+
+## RequireAuthor forces an author to enter a name before posting.
+function RequireAuthor($pagename, &$page, &$new) {
+  global $Author, $MessagesFmt, $AuthorRequiredFmt, $EnablePost;
+  if (!$Author) {
+    $MessagesFmt[] = $AuthorRequiredFmt;
+    $EnablePost = 0;
+  }
+}

Added: trunk/oggdsf/website/scripts/authuser.php
===================================================================
--- trunk/oggdsf/website/scripts/authuser.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/authuser.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,210 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2005-2007 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    The APR compatible MD5 encryption algorithm in _crypt() below is 
+    based on code Copyright 2005 by D. Faure and the File::Passwd
+    PEAR library module by Mike Wallner <mike at php.net>.
+
+    This script enables simple authentication based on username and 
+    password combinations.  At present this script can authenticate
+    from passwords held in arrays or in .htpasswd-formatted files,
+    but eventually it will support authentication via sources such
+    as LDAP and Active Directory.
+
+    To configure a .htpasswd-formatted file for authentication, do
+        $AuthUser['htpasswd'] = '/path/to/.htpasswd';
+    prior to including this script.  
+
+    Individual username/password combinations can also be placed
+    directly in the $AuthUser array, such as:
+        $AuthUser['pmichaud'] = crypt('secret');
+
+    To authenticate against an LDAP server, put the url for
+    the server in $AuthUser['ldap'], as in:
+        $AuthUser['ldap'] = 'ldap://ldap.example.com/ou=People,o=example?uid';
+*/
+
+# let Site.AuthForm know that we're doing user-based authorization
+$EnableAuthUser = 1;
+
+if (@$_POST['authid']) 
+  AuthUserId($pagename, stripmagic(@$_POST['authid']), 
+             stripmagic(@$_POST['authpw']));
+else SessionAuth($pagename);
+
+function AuthUserId($pagename, $id, $pw=NULL) {
+  global $AuthUser, $AuthUserPageFmt, $AuthUserFunctions, 
+    $AuthId, $MessagesFmt;
+
+  $auth = array();
+  foreach((array)$AuthUser as $k=>$v) $auth[$k] = (array)$v;
+  $authid = '';
+
+  # load information from SiteAdmin.AuthUser (or page in $AuthUserPageFmt)
+  SDV($AuthUserPageFmt, '$SiteAdminGroup.AuthUser');
+  SDVA($AuthUserFunctions, array(
+    'htpasswd' => 'AuthUserHtPasswd',
+    'ldap' => 'AuthUserLDAP',
+#    'mysql' => 'AuthUserMySQL',
+    $id => 'AuthUserConfig'));
+
+  $pn = FmtPageName($AuthUserPageFmt, $pagename);
+  $apage = ReadPage($pn, READPAGE_CURRENT);
+  if ($apage && preg_match_all("/^\\s*([@\\w][^\\s:]*):(.*)/m", 
+                               $apage['text'], $matches, PREG_SET_ORDER)) {
+    foreach($matches as $m) {
+      if (!preg_match_all('/\\bldaps?:\\S+|[^\\s,]+/', $m[2], $v))
+        continue;
+      if ($m[1]{0} == '@') 
+        foreach($v[0] as $g) $auth[$g][] = $m[1];
+      else $auth[$m[1]] = array_merge((array)@$auth[$m[1]], $v[0]);
+    }
+  }
+
+  if (is_null($pw)) $authid = $id;
+  else 
+    foreach($AuthUserFunctions as $k => $fn) 
+      if ($auth[$k] && $fn($pagename, $id, $pw, $auth[$k])) 
+        { $authid = $id; break; }
+
+  if (!$authid) { $GLOBALS['InvalidLogin'] = 1; return; }
+  if (!isset($AuthId)) $AuthId = $authid;
+  $authlist["id:$authid"] = 1;
+  $authlist["id:-$authid"] = -1;
+  foreach(preg_grep('/^@/', (array)@$auth[$authid]) as $g) 
+    $authlist[$g] = 1;
+  foreach(preg_grep('/^@/', (array)@$auth['*']) as $g) 
+    $authlist[$g] = 1;
+  foreach(preg_grep('/^@/', array_keys($auth)) as $g) 
+    if (in_array($authid, $auth[$g])) $authlist[$g] = 1;
+  if ($auth['htgroup']) {
+    foreach(AuthUserHtGroup($pagename, $id, $pw, $auth['htgroup']) as $g)
+      $authlist["@$g"] = 1;
+  }
+  SessionAuth($pagename, array('authid' => $authid, 'authlist' => $authlist));
+}
+
+
+function AuthUserConfig($pagename, $id, $pw, $pwlist) {
+  foreach ((array)$pwlist as $chal) 
+    if (_crypt($pw, $chal) == $chal) return true;
+  return false;
+}
+
+
+function AuthUserHtPasswd($pagename, $id, $pw, $pwlist) {
+  foreach ((array)$pwlist as $f) {
+    $fp = fopen($f, "r"); if (!$fp) continue;
+    while ($x = fgets($fp, 1024)) {
+      $x = rtrim($x);
+      list($i, $c, $r) = explode(':', $x, 3);
+      if ($i == $id && _crypt($pw, $c) == $c) { fclose($fp); return true; }
+    }
+    fclose($fp);
+  }
+  return false;
+}
+
+
+function AuthUserHtGroup($pagename, $id, $pw, $pwlist) {
+  $groups = array();
+  foreach ((array)$pwlist as $f) {
+    $fp = fopen($f, 'r'); if (!$fp) continue;
+    while ($x = fgets($fp, 4096)) {
+      if (preg_match('/^(\\w[^\\s:]+)\\s*:(.*)$/', trim($x), $match)) {
+        $glist = preg_split('/[\\s,]+/', $match[2], -1, PREG_SPLIT_NO_EMPTY);
+        if (in_array($id, $glist)) $groups[$match[1]] = 1;
+      }
+    }
+    fclose($fp);
+  }
+  return array_keys($groups);
+}
+  
+
+function AuthUserLDAP($pagename, $id, $pw, $pwlist) {
+  global $AuthLDAPBindDN, $AuthLDAPBindPassword;
+  if (!$pw) return false;
+  if (!function_exists('ldap_connect')) 
+    Abort('authuser: LDAP authentication requires PHP ldap functions','ldapfn');
+  foreach ((array)$pwlist as $ldap) {
+    if (!preg_match('!(ldaps?://[^/]+)/(.*)$!', $ldap, $match))
+      continue;
+    ##  connect to the LDAP server
+    list($z, $url, $path) = $match;
+    $ds = ldap_connect($url);
+    ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
+    ##  For Active Directory, don't specify a path and we simply
+    ##  attempt to bind with the username and password directly
+    if (!$path && @ldap_bind($ds, $id, $pw)) { ldap_close($ds); return true; }
+    ##  Otherwise, we use Apache-style urls for LDAP authentication
+    ##  Split the path into its search components
+    list($basedn, $attr, $sub, $filter) = explode('?', $path);
+    if (!$attr) $attr = 'uid';
+    if (!$sub) $sub = 'one';
+    if (!$filter) $filter = '(objectClass=*)';
+    $binddn = @$AuthLDAPBindDN;
+    $bindpw = @$AuthLDAPBindPassword;
+    if (ldap_bind($ds, $binddn, $bindpw)) {
+      ##  Search for the appropriate uid
+      $fn = ($sub == 'sub') ? 'ldap_search' : 'ldap_list';
+      $sr = $fn($ds, $basedn, "(&$filter($attr=$id))", array($attr));
+      $x = ldap_get_entries($ds, $sr);
+      ##  If we find a unique id, bind to it for success
+      if ($x['count'] == 1) {
+        $dn = $x[0]['dn'];
+        if (@ldap_bind($ds, $dn, $pw)) { ldap_close($ds); return true; }
+      }
+    }
+    ldap_close($ds);
+  }
+  return false;
+}
+
+
+#  The _crypt function provides support for SHA1 encrypted passwords 
+#  (keyed by '{SHA}') and Apache MD5 encrypted passwords (keyed by 
+#  '$apr1$'); otherwise it just calls PHP's crypt() for the rest.
+#  The APR MD5 encryption code was contributed by D. Faure.
+
+function _crypt($plain, $salt=null) {
+  if (strncmp($salt, '{SHA}', 5) == 0) 
+    return '{SHA}'.base64_encode(pack('H*', sha1($plain)));
+  if (strncmp($salt, '$apr1$', 6) == 0) {
+    preg_match('/^\\$apr1\\$([^$]+)/', $salt, $match);
+    $salt = $match[1];
+    $length = strlen($plain);
+    $context = $plain . '$apr1$' . $salt;
+    $binary = pack('H32', md5($plain . $salt . $plain));
+    for($i = $length; $i > 0; $i -= 16) 
+      $context .= substr($binary, 0, min(16, $i));
+    for($i = $length; $i > 0; $i >>= 1)
+      $context .= ($i & 1) ? chr(0) : $plain{0};
+    $binary = pack('H32', md5($context));
+    for($i = 0; $i < 1000; $i++) {
+      $new = ($i & 1) ? $plain : $binary;
+      if ($i % 3) $new .= $salt;
+      if ($i % 7) $new .= $plain;
+      $new .= ($i & 1) ? $binary : $plain;
+      $binary = pack('H32', md5($new));
+    }
+    $q = '';
+    for ($i = 0; $i < 5; $i++) {
+      $k = $i + 6;
+      $j = $i + 12;
+      if ($j == 16) $j = 5;
+      $q = $binary{$i}.$binary{$k}.$binary{$j} . $q;
+    }
+    $q = chr(0).chr(0).$binary{11} . $q;
+    $q = strtr(strrev(substr(base64_encode($q), 2)),
+           'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
+           './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz');
+    return "\$apr1\$$salt\$$q";
+  }
+  if (md5($plain) == $salt) return $salt;
+  return crypt($plain, $salt);
+}

Added: trunk/oggdsf/website/scripts/blocklist.php
===================================================================
--- trunk/oggdsf/website/scripts/blocklist.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/blocklist.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,239 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2006-2007 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This script adds blocklisting capabilities to PmWiki, and can
+    be enabled by simply setting the following in local/config.php:
+
+        $EnableBlocklist = 1;
+
+    With $EnableBlocklist set to 1, this module will search through
+    the SiteAdmin.Blocklist page, as well as any other pages given by
+    the $Blocklist pages variable, looking for lines of the
+    form "block:some phrase" or "block:/regex/", with "some phrase" 
+    and "/regex/" indicating things to be excluded from any 
+    posting to the site.  
+
+    In addition, if a page contains IP addresses of the form
+    "a.b.c.d" or "a.b.c.*", then any posts coming from hosts
+    matching the address will be blocked.
+
+    There is also an "unblock:..." form, which removes an entry
+    from the blocklist.  This is useful for removing specific
+    block items in wikifarms and with automatically downloaded
+    blocklists (below).
+
+    The script also has the capability of automatically downloading
+    blocklists from other sources, such as chongqed.org and
+    and the MoinMaster blocklist.  These are configured using
+    the $BlocklistDownload array.  An $EnableBlocklist value
+    of at least 10 configures PmWiki to automatically download
+    these external blocklists and refresh them daily.
+
+    More information about blocklists is available in the
+    PmWiki.Blocklist page.
+*/
+
+
+##   Some recipes do page updates outside of the built-in posting
+##   cycle, so $EnableBlocklistImmediate is used to determine if
+##   we need to catch these.  Currently this defaults to enabled,
+##   but at some point we may change the default to disabled.
+if (IsEnabled($EnableBlocklistImmediate, 1)) {
+  SDVA($BlocklistActions, array('comment' => 1));
+  if (isset($_POST['text']) && $BlocklistActions[$action]) {
+    Blocklist($pagename, $_POST['text']);
+    if (!$EnablePost) {
+      unset($_POST['post']);
+      unset($_POST['postattr']);
+      unset($_POST['postedit']);
+    }
+  }
+}
+
+
+##   If $EnableBlocklist is set to 10 or higher, then arrange to 
+##   periodically download the "chongqed" and "moinmaster" blacklists.
+if ($EnableBlocklist >= 10) {
+  SDVA($BlocklistDownload['SiteAdmin.Blocklist-Chongqed'], array(
+    'url' => 'http://blacklist.chongqed.org/',
+    'format' => 'regex'));
+  SDVA($BlocklistDownload['SiteAdmin.Blocklist-MoinMaster'], array(
+    'url' => 'http://moinmaster.wikiwikiweb.de/BadContent?action=raw',
+    'format' => 'regex'));
+}
+
+
+##   CheckBlocklist is inserted into $EditFunctions, to automatically
+##   check for blocks on anything being posted through the normal
+##   "update a page cycle"
+array_unshift($EditFunctions, 'CheckBlocklist');
+function CheckBlocklist($pagename, &$page, &$new) { 
+  StopWatch("CheckBlocklist: begin $pagename");
+  $ptext = implode('', @$_POST);
+  if (@$ptext) Blocklist($pagename, $ptext); 
+  StopWatch("CheckBlocklist: end $pagename");
+}
+
+
+##   Blocklist is the function that does all of the work of
+##   checking for reasons to block a posting.  It reads
+##   the available blocklist pages ($BlocklistPages) and
+##   builds an array of strings and regular expressiongs to
+##   be checked against the page; if any are found, then
+##   posting is blocked (via $EnablePost=0).  The function
+##   also checks the REMOTE_ADDR against any blocked IP addresses.
+function Blocklist($pagename, $text) {
+  global $BlocklistPages, $BlockedMessagesFmt, $BlocklistDownload,
+    $BlocklistDownloadRefresh, $Now, $EnablePost, $WhyBlockedFmt,
+    $MessagesFmt, $BlocklistMessageFmt, $EnableWhyBlocked, $IsBlocked;
+
+  StopWatch("Blocklist: begin $pagename");
+
+  $BlocklistDownload = (array)@$BlocklistDownload;
+  SDV($BlocklistPages, 
+    array_merge(array('$SiteAdminGroup.Blocklist', 
+                      '$SiteAdminGroup.Blocklist-Farm'),
+                array_keys($BlocklistDownload)));
+  SDV($BlocklistMessageFmt, "<h3 class='wikimessage'>$[This post has been blocked by the administrator]</h3>");
+  SDVA($BlockedMessagesFmt, array(
+    'ip' => '$[Address blocked from posting]: ',
+    'text' => '$[Text blocked from posting]: '));
+  SDV($BlocklistDownloadRefresh, 86400);
+
+  ##  Loop over all blocklist pages
+  foreach((array)$BlocklistPages as $b) {
+
+    ##  load the current blocklist page
+    $pn = FmtPageName($b, $pagename);
+    $page = ReadPage($pn, READPAGE_CURRENT);
+    if (!$page) continue;
+
+    ##  if the page being checked is a blocklist page, stop blocking
+    if ($pagename == $pn) return;
+
+    ##  If the blocklist page is managed by automatic download,
+    ##  schedule any new downloads here
+    if (@$BlocklistDownload[$pn]) {
+      $bd = &$BlocklistDownload[$pn];
+      SDVA($bd, array(
+        'refresh' => $BlocklistDownloadRefresh,
+        'url' => "http://www.pmwiki.org/blocklists/$pn" ));
+      if (!@$page['text'] || $page['time'] < $Now - $bd['refresh'])
+        register_shutdown_function('BlocklistDownload', $pn, getcwd());
+    }
+
+    ##  If the blocklist is simply a list of regexes to be matched, load 
+    ##  them into $terms['block'] and continue to the next blocklist page.
+    ##  Some regexes from remote sites aren't well-formed, so we have
+    ##  to escape any slashes that aren't already escaped.
+    if (strpos($page['text'], 'blocklist-format: regex') !==false) {
+      if (preg_match_all('/^([^\\s#].+)/m', $page['text'], $match)) 
+        foreach($match[0] as $m) {
+          $m = preg_replace('#(?<!\\\\)/#', '\\/', trim($m));
+          $terms['block'][] = "/$m/";
+        }
+      continue;
+    }
+
+    ##  Treat the page as a pmwiki-format blocklist page, with
+    ##  IP addresses and "block:"-style declarations.  First, see
+    ##  if we need to block the author based on a.b.c.d or a.b.c.*
+    ##  IP addresses.
+    $ip = preg_quote($_SERVER['REMOTE_ADDR']);
+    $ip = preg_replace('/\\d+$/', '($0\\b|\\*)', $ip);
+    if (preg_match("/\\b$ip/", $page['text'], $match)) {
+      $EnablePost = 0;
+      $IsBlocked = 1;
+      $WhyBlockedFmt[] = $BlockedMessagesFmt['ip'] . $match[0];
+    }
+
+    ##  Now we'll load any "block:" or "unblock:" specifications
+    ##  from the page text.
+    if (preg_match_all('/(un)?(?:block|regex):(.*)/', $page['text'], 
+                       $match, PREG_SET_ORDER)) 
+      foreach($match as $m) $terms[$m[1].'block'][] = trim($m[2]);
+  }
+
+  ##  okay, we've loaded all of the terms, now subtract any 'unblock'
+  ##  terms from the block set.
+  StopWatch("Blocklist: diff unblock");
+  $blockterms = array_diff((array)@$terms['block'], (array)@$terms['unblock']);
+
+  ##  go through each of the remaining blockterms and see if it matches the
+  ##  text -- if so, disable posting and add a message to $WhyBlockedFmt.
+  StopWatch('Blocklist: blockterms (count='.count($blockterms).')');
+  $itext = strtolower($text);
+  foreach($blockterms as $b) {
+    if ($b{0} == '/') {
+      if (!preg_match($b, $text)) continue;
+    } else if (strpos($itext, strtolower($b)) === false) continue;
+    $EnablePost = 0;
+    $IsBlocked = 1;
+    $WhyBlockedFmt[] = $BlockedMessagesFmt['text'] . $b;
+  }
+  StopWatch('Blocklist: blockterms done');
+
+  ##  If we came across any reasons to block, let's provide a message
+  ##  to the author that it was blocked.  If $EnableWhyBlocked is set,
+  ##  we'll even tell the author why.  :-)
+  if (@$WhyBlockedFmt) {
+    $MessagesFmt[] = $BlocklistMessageFmt;
+    if (IsEnabled($EnableWhyBlocked, 0)) 
+      foreach((array)$WhyBlockedFmt as $why) 
+        $MessagesFmt[] = "<pre class='blocklistmessage'>$why</pre>\n";
+  }
+  StopWatch("Blocklist: end $pagename");
+}
+
+
+##   BlocklistDownload() handles retrieving blocklists from
+##   external sources into PmWiki pages.  If it's able to
+##   download an updated list, it uses that; otherwise it leaves
+##   any existing list alone.
+function BlocklistDownload($pagename, $dir = '') {
+  global $BlocklistDownloadFmt, $BlocklistDownload, $FmtV;
+
+  if ($dir) { flush(); chdir($dir); }
+  SDV($BlocklistDownloadFmt, "
+  [@
+## blocklist-note:   NOTE: This page is automatically generated by blocklist.php
+## blocklist-note:   NOTE: Any edits to this page may be lost!
+## blocklist-url:    \$BlocklistDownloadUrl
+## blocklist-when:   \$CurrentTimeISO
+#  blocklist-format: \$BlocklistFormat
+\$BlocklistData
+  @]
+");
+
+  ##  get the existing blocklist page
+  $bd = &$BlocklistDownload[$pagename];
+  $page = ReadPage($pagename, READPAGE_CURRENT);
+
+  ##  try to retrieve the remote data
+  $blocklistdata = @file($bd['url']);
+
+  ##  if we didn't get it, and we don't already have text, save a
+  ##  note in the page so we know what happened
+  if (!$blocklistdata && !@$page['text']) {
+    $auf = ini_get('allow_url_fopen');
+    $blocklistdata = "#### Unable to download blocklist (allow_url_fopen=$auf)";
+  }
+
+  ##  if we have some new text to save, let's format it and save it
+  if ($blocklistdata) {
+    $blocklistdata = implode('', (array)$blocklistdata);
+    $blocklistdata = preg_replace('/^##blocklist.*/m', '', $blocklistdata);
+    $FmtV['$BlocklistData'] = $blocklistdata;
+    $FmtV['$BlocklistDownloadUrl'] = $bd['url'];
+    $FmtV['$BlocklistFormat'] = $bd['format'];
+    $page['text'] = FmtPageName($BlocklistDownloadFmt, $pagename);
+    SDV($page['passwdread'], '@lock');
+  }
+
+  ##  save our updated(?) blocklist page
+  WritePage($pagename, $page);
+}

Added: trunk/oggdsf/website/scripts/caches.php
===================================================================
--- trunk/oggdsf/website/scripts/caches.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/caches.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,58 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2006 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+*/
+
+## Browser cache-control.  If this is a cacheable action (e.g., browse,
+## diff), then set the Last-Modified header to the time the site was 
+## last modified.  If the browser has provided us with a matching 
+## If-Modified-Since request header, we can return 304 Not Modified.
+SDV($LastModFile,"$WorkDir/.lastmod");
+if (!$LastModFile) return;
+
+$LastModTime = @filemtime($LastModFile);
+foreach(get_included_files() as $f) 
+  { $v = @filemtime($f); if ($v > $LastModTime) $LastModTime = $v; }
+
+if (@$EnableIMSCaching) {
+  SDV($IMSCookie, $CookiePrefix.'imstime');
+  SDV($IMSCookieExpires, $Now + 60*60*24*30);
+  SDV($IMSInvalidators, array('authpw', 'author'));
+  $LogoutCookies[] = $IMSCookie;
+
+  if ($IMSCookie) {
+    $IMSTime = @$_COOKIE[$IMSCookie];
+    if ($IMSTime < $LastModTime
+        || array_intersect($IMSInvalidators, array_keys($_POST))) {
+      $IMSTime = $Now; 
+      setcookie($IMSCookie, $IMSTime, $IMSCookieExpires, '/');
+    }
+  } else $IMSTime = $LastModTime;
+
+  if (in_array($action, (array)$CacheActions)) {
+    $HTTPLastMod = gmdate('D, d M Y H:i:s \G\M\T',$IMSTime);
+    $HTTPHeaders[] = "Cache-Control: no-cache";
+    $HTTPHeaders[] = "Last-Modified: $HTTPLastMod";
+    if (@$_SERVER['HTTP_IF_MODIFIED_SINCE']==$HTTPLastMod)
+      { header("HTTP/1.0 304 Not Modified"); exit(); }
+  }
+}
+
+if ($NoHTMLCache 
+    || !@$PageCacheDir
+    || count($_POST) > 0
+    || count($_GET) > 2
+    || (count($_GET) == 1 && !@$_GET['n'])) { $NoHTMLCache |= 1; return; }
+
+mkdirp($PageCacheDir);
+if (!file_exists("$PageCacheDir/.htaccess") 
+    && $fp = @fopen("$PageCacheDir/.htaccess", "w"))
+  { fwrite($fp, "Order Deny,Allow\nDeny from all\n"); fclose($fp); }
+$PageCacheFile = "$PageCacheDir/$pagename,cache";
+if (file_exists($PageCacheFile) && @filemtime($PageCacheFile) < $LastModTime) 
+  @unlink($PageCacheFile);
+

Added: trunk/oggdsf/website/scripts/creole.php
===================================================================
--- trunk/oggdsf/website/scripts/creole.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/creole.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,66 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2007 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This script adds Creole v0.4 markup (http://www.wikicreole.org/)
+    to PmWiki.  To activate this script, simply add the following into
+    a local customization file:
+
+        include_once('scripts/creole.php');
+
+*/
+
+## **strong**
+Markup('**', 'inline', 
+  '/^\\*\\*(?>(.+?)\\*\\*)(?!\\S)|(?<!^)\\*\\*(.+?)\\*\\*/',
+  '<strong>$1$2</strong>');
+
+## //emphasized//
+Markup('//', 'inline', 
+  '/(?<!http:|ftp:)\\/\\/(.*?)\\/\\//',
+  '<em>$1</em>');
+
+## == Headings ==
+Markup('^=', 'block',
+  '/^(={1,6})\\s?(.*?)(\\s*=*\\s*)$/e',
+  "'<:block,1><h'.strlen('$1').PSS('>$2</h').strlen('$1').'>'");
+
+## Line breaks
+Markup('\\\\', 'inline', '/\\\\\\\\/', '<br />');
+
+## Preformatted
+Markup('^{{{', '[=',
+  "/^\\{\\{\\{\n(.*?\n)\\}\\}\\}[^\\S\n]*\n/sme",
+  "Keep(PSS('<pre class=\"escaped\">$1</pre>'))");
+Markup('{{{', '>{{{',
+  '/\\{\\{\\{(.*?)\\}\\}\\}/se',
+  "Keep(PSS('<code class=\"escaped\">$1</code>'))");
+
+## Tables
+Markup('|-table', '>^||',
+  '/^\\|(.*)$/e',
+  "FormatTableRow(PSS('$0'), '\\|')");
+
+## Images
+Markup('{{', 'inline',
+  '/\\{\\{(?>(\\L))([^|\\]]*)(?:\\|\\s*(.*?)\\s*)?\\}\\}/e',
+  "Keep(\$GLOBALS['LinkFunctions']['$1'](\$pagename, '$1', '$2', '$3',
+     '$1$2', \$GLOBALS['ImgTagFmt']),'L')");
+
+
+## GUIButtons
+SDVA($GUIButtons, array(
+  'em'       => array(100, "//", "//", '$[Emphasized]',
+                  '$GUIButtonDirUrlFmt/em.gif"$[Emphasized (italic)]"',
+                  '$[ak_em]'),
+  'strong'   => array(110, "**", "**", '$[Strong]',
+                  '$GUIButtonDirUrlFmt/strong.gif"$[Strong (bold)]"',
+                  '$[ak_strong]'),
+  'h2'       => array(400, '\\n== ', ' ==\\n', '$[Heading]',
+                  '$GUIButtonDirUrlFmt/h.gif"$[Heading]"'),
+
+  ));
+

Added: trunk/oggdsf/website/scripts/crypt.php
===================================================================
--- trunk/oggdsf/website/scripts/crypt.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/crypt.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,40 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2002-2004 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This script defines ?action=crypt, providing help for WikiAdministrators
+    to set up site-wide passwords in the installation.
+*/
+
+SDV($HandleActions['crypt'],'HandleCrypt');
+SDV($ActionTitleFmt['crypt'],'| $[Password encryption]');
+
+function HandleCrypt($pagename, $auth='read') {
+  global $ScriptUrl,$HTMLStartFmt,$HTMLEndFmt;
+  PrintFmt($pagename,$HTMLStartFmt);
+  $passwd = @$_POST["passwd"];
+  echo FmtPageName(
+    "<form action='{\$ScriptUrl}' method='POST'><p>
+      Enter password to encrypt: 
+      <input type='text' name='passwd' value='$passwd' />
+      <input type='submit' />
+      <input type='hidden' name='n' value='{\$FullName}' />
+      <input type='hidden' name='action' value='crypt' /></p></form>",
+    $pagename);
+  if ($passwd) { 
+    $crypt = crypt($passwd);
+    echo "<p class='vspace'>Encrypted password = $crypt</p>"; 
+    echo "<p class='vspace'>To set a site-wide password, insert the line below
+      in your <i>config.php</i> file, <br />replacing <tt>'type'</tt> with
+      one of <tt>'admin'</tt>, <tt>'read'</tt>, <tt>'edit'</tt>,
+      or <tt>'attr'</tt>.  <br />See <a 
+      href='$ScriptUrl?n=PmWiki.PasswordsAdmin'>PasswordsAdmin</a> for more
+      details.</p>
+      <pre class='vspace'>  \$DefaultPasswords['type']='$crypt';</pre>";
+  }
+  PrintFmt($pagename,$HTMLEndFmt);
+}
+

Added: trunk/oggdsf/website/scripts/diag.php
===================================================================
--- trunk/oggdsf/website/scripts/diag.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/diag.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,53 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2003-2005, 2007 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This file adds "?action=diag" and "?action=phpinfo" actions to PmWiki.  
+    This produces lots of diagnostic output that may be helpful to the 
+    software authors when debugging PmWiki or other scripts.
+*/
+
+ at ini_set('display_errors', '1');
+ at ini_set('track_errors','1');
+
+if ($action=='diag') {
+  @session_start();
+  header('Content-type: text/plain');
+  print_r($GLOBALS);
+  exit();
+}
+
+if ($action=='phpinfo') { phpinfo(); exit(); }
+
+function Ruleset() {
+  global $MarkupTable;
+  $out = '';
+  BuildMarkupRules();
+  foreach($MarkupTable as $id=>$m) 
+    $out .= sprintf("%-16s %-16s %-16s\n",$id,@$m['cmd'],@$m['seq']);
+  return $out;
+}
+
+$HandleActions['ruleset'] = 'HandleRuleset';
+
+function HandleRuleset($pagename) {
+  header("Content-type: text/plain");
+  print Ruleset();
+}
+
+function StopWatchHTML($pagename, $print = 0) {
+  global $StopWatch;
+  StopWatch('now');
+  $l = strlen(count($StopWatch));
+  $out = '<pre>';
+  foreach((array)$StopWatch as $i => $x)
+    $out .= sprintf("%{$l}d: %s\n", $i, $x);
+  $out .= '</pre>';
+  if (is_array($StopWatch)) array_pop($StopWatch);
+  if ($print) print $out;
+  return $out;
+}
+

Added: trunk/oggdsf/website/scripts/draft.php
===================================================================
--- trunk/oggdsf/website/scripts/draft.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/draft.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,63 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2006 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+*/
+
+SDV($DraftSuffix, '-Draft');
+if ($DraftSuffix) 
+  SDV($SearchPatterns['normal']['draft'], "!$DraftSuffix\$!");
+
+##  set up a 'publish' authorization level, defaulting to 'edit' authorization
+SDV($DefaultPasswords['publish'], '');
+SDV($AuthCascade['publish'], 'edit');
+SDV($FmtPV['$PasswdPublish'], 'PasswdVar($pn, "publish")');
+if ($AuthCascade['attr'] == 'edit') $AuthCascade['attr'] = 'publish';
+
+## Add a 'publish' page attribute if desired
+if (IsEnabled($EnablePublishAttr, 0))
+  SDV($PageAttributes['passwdpublish'], '$[Set new publish password:]');
+
+##  with drafts enabled, the 'post' operation requires 'publish' permissions
+if ($action == 'edit' && $_POST['post'] && $HandleAuth['edit'] == 'edit')
+  $HandleAuth['edit'] = 'publish';
+
+$basename = preg_replace("/$DraftSuffix\$/", '', $pagename);
+##  if no -Draft page, switch to $basename
+if (!PageExists($pagename) && PageExists($basename)) $pagename = $basename;
+
+##  set edit form button labels to reflect draft prompts
+SDVA($InputTags['e_savebutton'], array('value' => ' '.XL('Publish').' '));
+SDVA($InputTags['e_saveeditbutton'], array('value' => ' '.XL('Save draft and edit').' '));
+SDVA($InputTags['e_savedraftbutton'], array(
+    ':html' => "<input type='submit' \$InputFormArgs />",
+    'name' => 'postdraft', 'value' => ' '.XL('Save draft').' ',
+    'accesskey' => XL('ak_savedraft')));
+
+##  disable the 'publish' button if not authorized to publish
+if (!CondAuth($basename, 'publish')) 
+  SDVA($InputTags['e_savebutton'], array('disabled' => 'disabled'));
+
+##  add the draft handler into $EditFunctions
+if ($action == 'edit') array_unshift($EditFunctions, 'EditDraft');
+function EditDraft(&$pagename, &$page, &$new) {
+  global $WikiDir, $DraftSuffix, $DeleteKeyPattern, 
+    $DraftRecentChangesFmt, $RecentChangesFmt;
+  SDV($DeleteKeyPattern, "^\\s*delete\\s*$");
+  $basename = preg_replace("/$DraftSuffix\$/", '', $pagename);
+  $draftname = $basename . $DraftSuffix;
+  if ($_POST['postdraft'] || $_POST['postedit']) $pagename = $draftname; 
+  else if ($_POST['post'] && !preg_match("/$DeleteKeyPattern/", $new['text'])) { 
+    $pagename = $basename; 
+    $page = ReadPage($basename);
+    $WikiDir->delete($draftname);
+  }
+  else if (PageExists($draftname) && $pagename != $draftname)
+    { Redirect($draftname, '$PageUrl?action=edit'); exit(); }
+  if ($pagename == $draftname && isset($DraftRecentChangesFmt))
+    $RecentChangesFmt = $DraftRecentChangesFmt;
+}
+
+

Added: trunk/oggdsf/website/scripts/feeds.php
===================================================================
--- trunk/oggdsf/website/scripts/feeds.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/feeds.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,544 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2005-2007 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This script provides a number of syndication feed and xml-based 
+    metadata options to PmWiki, including Atom, RSS 2.0, RSS 1.0 (RDF), 
+    and the Dublin Core Metadata extensions.  This module is typically
+    activated from a local configuration file via a line such as
+
+      if ($action == 'atom') include_once("$FarmD/scripts/feeds.php");
+      if ($action == 'dc') include_once("$FarmD/scripts/feeds.php");
+
+    When enabled, ?action=atom, ?action=rss, and ?action=rdf produce
+    syndication feeds based on any wikitrail contained in the page,
+    or, for Category pages, on the pages in the category.  The feeds
+    are generated using pagelist, thus one can include parameters such
+    as count=, list=, order=, etc. in the url to adjust the feed output.
+
+    ?action=dc will normally generate Dublin Core Metadata for the 
+    current page only, but placing a group=, trail=, or link= argument 
+    in the url causes it to generate metadata for all pages in the
+    associated group, trail, or backlink.
+
+    There are a large number of customizations available, most of which
+    are controlled by the $FeedFmt array.  Elements $FeedFmt look like
+
+        $FeedFmt['atom']['feed']['rights'] = 'All Rights Reserved';
+
+    where the first index corresponds to the action (?action=atom),
+    the second index indicates a per-feed or per-item element, and
+    the third index is the name of the element being generated.
+    The above setting would therefore generate a
+    "<rights>All Rights Reserved</rights>" in the feed for
+    ?action=atom.  If the value of an entry begins with a '<',
+    then feeds.php doesn't automatically add the tag around it.
+    Elements can also be callable functions which are called to
+    generate the appropriate output.
+
+    For example, to set the RSS 2.0 <author> element to the
+    value of the last author to modify a page, one can set 
+    (in local/config.php):
+
+        $FeedFmt['rss']['item']['author'] = '$LastModifiedBy';
+
+    To use the RSS 2.0 <description> element to contain the
+    change summary of the most recent edit, set
+
+        $FeedFmt['rss']['item']['description'] = '$LastModifiedSummary';
+
+    Feeds.php can also be combined with attachments to support
+    podcasting via ?action=rss.  Any page such as "PageName"
+    that has an mp3 attachment with the same name as the page
+    ("PageName.mp3") will have an appropriate <enclosure> element
+    in the feed output.  The set of allowed attachments can be
+    extended using the $RSSEnclosureFmt array:
+
+        $RSSEnclosureFmt = array('{$Name}.mp3', '{$Name}.mp4');
+
+    References:
+      http://www.atomenabled.org/developers/syndication/
+      http://dublincore.org/documents/dcmes-xml/
+      http://en.wikipedia.org/wiki/Podcasting
+*/
+
+## Settings for ?action=atom
+SDVA($FeedFmt['atom']['feed'], array(
+  '_header' => 'Content-type: text/xml; charset="$Charset"',
+  '_start' => '<?xml version="1.0" encoding="$Charset"?'.'>
+<feed xmlns="http://www.w3.org/2005/Atom">'."\n",
+  '_end' => "</feed>\n",
+  'title' => '$WikiTitle',
+  'link' => '<link rel="self" href="{$PageUrl}?action=atom" />',
+  'id' => '{$PageUrl}?action=atom',
+  'updated' => '$FeedISOTime',
+  'author' => "<author><name>$WikiTitle</name></author>\n",
+  'generator' => '$Version',
+  'logo' => '$PageLogoUrl'));
+SDVA($FeedFmt['atom']['item'], array(
+  '_start' => "<entry>\n",
+  'id' => '{$PageUrl}',
+  'title' => '{$Title}',
+  'updated' => '$ItemISOTime',
+  'link' => "<link rel=\"alternate\" href=\"{\$PageUrl}\" />\n",
+  'author' => "<author><name>{\$LastModifiedBy}</name></author>\n",
+  'summary' => '{$Description}',
+  'category' => "<category term=\"\$Category\" />\n",
+  '_end' => "</entry>\n"));
+
+## Settings for ?action=dc
+SDVA($FeedFmt['dc']['feed'], array(
+  '_header' => 'Content-type: text/xml; charset="$Charset"',
+  '_start' => '<?xml version="1.0" encoding="$Charset"?'.'>
+<!DOCTYPE rdf:RDF PUBLIC "-//DUBLIN CORE//DCMES DTD 2002/07/31//EN"
+    "http://dublincore.org/documents/2002/07/31/dcmes-xml/dcmes-xml-dtd.dtd">
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+         xmlns:dc="http://purl.org/dc/elements/1.1/">'."\n",
+  '_end' => "</rdf:RDF>\n"));
+SDVA($FeedFmt['dc']['item'], array(
+  '_start' => "<rdf:Description rdf:about=\"{\$PageUrl}\">\n",
+  'dc:title' => '{$Title}',
+  'dc:identifier' => '{$PageUrl}',
+  'dc:date' => '$ItemISOTime',
+  'dc:type' => 'Text',
+  'dc:format' => 'text/html',
+  'dc:description' => '{$Description}',
+  'dc:subject' => "<dc:subject>\$Category</dc:subject>\n",
+  'dc:publisher' => '$WikiTitle',
+  'dc:author' => '{$LastModifiedBy}',
+  '_end' => "</rdf:Description>\n"));
+
+## RSS 2.0 settings for ?action=rss
+SDVA($FeedFmt['rss']['feed'], array(
+  '_header' => 'Content-type: text/xml; charset="$Charset"',
+  '_start' => '<?xml version="1.0" encoding="$Charset"?'.'>
+<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
+<channel>'."\n",
+  '_end' => "</channel>\n</rss>\n",
+  'title' => '$WikiTitle | {$Group} / {$Title}',
+  'link' => '{$PageUrl}?action=rss',
+  'description' => '{$Group}.{$Title}',
+  'lastBuildDate' => '$FeedRSSTime'));
+SDVA($FeedFmt['rss']['item'], array(
+  '_start' => "<item>\n",
+  '_end' => "</item>\n",
+  'title' => '{$Group} / {$Title}',
+  'link' => '{$PageUrl}',
+  'description' => '{$Description}',
+  'dc:contributor' => '{$LastModifiedBy}',
+  'dc:date' => '$ItemISOTime',
+  'pubDate' => '$ItemRSSTime',
+  'enclosure' => 'RSSEnclosure'));
+
+## RDF 1.0, for ?action=rdf
+SDVA($FeedFmt['rdf']['feed'], array(
+  '_header' => 'Content-type: text/xml; charset="$Charset"',
+  '_start' => '<?xml version="1.0" encoding="$Charset"?'.'>
+<rdf:RDF xmlns="http://purl.org/rss/1.0/"
+         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+         xmlns:dc="http://purl.org/dc/elements/1.1/">
+  <channel rdf:about="{$PageUrl}?action=rdf">'."\n",
+  'title' => '$WikiTitle | {$Group} / {$Title}',
+  'link' => '{$PageUrl}?action=rdf',
+  'description' => '{$Group}.{$Title}',
+  'dc:date' => '$FeedISOTime',
+  'items' => "<items>\n<rdf:Seq>\n\$FeedRDFSeq</rdf:Seq>\n</items>\n",
+  '_items' => "</channel>\n",
+  '_end' => "</rdf:RDF>\n"));
+SDVA($FeedFmt['rdf']['item'], array(
+  '_start' => "<item rdf:about=\"{\$PageUrl}\">\n",
+  '_end' => "</item>\n",
+  'title' => '$WikiTitle | {$Group} / {$Title}',
+  'link' => '{$PageUrl}',
+  'description' => '{$Description}',
+  'dc:date' => '$ItemISOTime'));
+  
+foreach(array_keys($FeedFmt) as $k) {
+  SDV($HandleActions[$k], 'HandleFeed');
+  SDV($HandleAuth[$k], 'read');
+}
+
+function HandleFeed($pagename, $auth = 'read') {
+  global $FeedFmt, $action, $PCache, $FmtV, $TimeISOZFmt, $RSSTimeFmt,
+    $FeedPageListOpt, $FeedCategoryOpt, $FeedTrailOpt,
+    $FeedDescPatterns, $CategoryGroup, $EntitiesTable;
+  SDV($RSSTimeFmt, 'D, d M Y H:i:s \G\M\T');
+  SDV($FeedDescPatterns, 
+    array('/<[^>]*$/' => ' ', '/\\w+$/' => '', '/<[^>]+>/' => ''));
+  $FeedPageListOpt = (array)@$FeedPageListOpt;
+  SDVA($FeedCategoryOpt, array('link' => $pagename));
+  SDVA($FeedTrailOpt, array('trail' => $pagename, 'count' => 10));
+
+  $f = $FeedFmt[$action];
+  $page = RetrieveAuthPage($pagename, $auth, true, READPAGE_CURRENT);
+  if (!$page) Abort("?cannot generate feed");
+  $feedtime = $page['time'];
+
+  # determine list of pages to display
+  if (@($_REQUEST['trail'] || $_REQUEST['group'] || $_REQUEST['link'] 
+        || $_REQUEST['name'])) 
+    $opt = $FeedPageListOpt;
+  else if (preg_match("/^$CategoryGroup\\./", $pagename)) 
+    $opt = $FeedCategoryOpt;
+  else if ($action != 'dc') $opt = $FeedTrailOpt;
+  else { 
+    PCache($pagename, $page); 
+    $pagelist = array($pagename); 
+  }
+  if (!@$pagelist) {
+    $opt = array_merge($opt, @$_REQUEST);
+    $pagelist = MakePageList($pagename, $opt, 0);
+  }
+
+  # process list of pages in feed
+  $rdfseq = '';
+  $pl = array();
+  foreach($pagelist as $pn) {
+    if (!PageExists($pn)) continue;
+    if (!isset($PCache[$pn]['time'])) 
+      { $page = ReadPage($pn, READPAGE_CURRENT); PCache($pn, $page); }
+    $pc = & $PCache[$pn];
+    $pl[] = $pn;
+    if (@$opt['count'] && count($pl) >= $opt['count']) break;
+    $rdfseq .= FmtPageName("<rdf:li resource=\"{\$PageUrl}\" />\n", $pn);
+    if ($pc['time'] > $feedtime) $feedtime = $pc['time'];
+  }
+  $pagelist = $pl;
+
+  $FmtV['$FeedRDFSeq'] = $rdfseq;
+  $FmtV['$FeedISOTime'] = gmstrftime($TimeISOZFmt, $feedtime);
+  $FmtV['$FeedRSSTime'] = gmdate($RSSTimeFmt, $feedtime);
+  # format start of feed
+  $out = FmtPageName($f['feed']['_start'], $pagename);
+
+  # format feed elements
+  foreach($f['feed'] as $k => $v) {
+    if ($k{0} == '_' || !$v) continue;
+    $x = FmtPageName($v, $pagename);
+    if (!$x) continue;
+    $out .= ($v{0} == '<') ? $x : "<$k>$x</$k>\n";
+  }
+
+  # format items in feed
+  if (@$f['feed']['_items']) 
+    $out .= FmtPageName($f['feed']['_items'], $pagename);
+  foreach($pagelist as $pn) {
+    $page = &$PCache[$pn];
+    $FmtV['$ItemDesc'] = @$page['description'];
+    $FmtV['$ItemISOTime'] = gmstrftime($TimeISOZFmt, $page['time']);
+    $FmtV['$ItemRSSTime'] = gmdate($RSSTimeFmt, $page['time']);
+
+    $out .= FmtPageName($f['item']['_start'], $pn);
+    foreach((array)@$f['item'] as $k => $v) {
+      if ($k{0} == '_' || !$v) continue;
+      if (is_callable($v)) { $out .= $v($pn, $page, $k); continue; }
+      if (strpos($v, '$LastModifiedBy') !== false && !@$page['author']) 
+        continue;
+      if (strpos($v, '$Category') !== false) {
+        if (preg_match_all("/(?<=^|,)$CategoryGroup\\.([^,]+)/", 
+                           @$page['targets'], $match)) {
+          foreach($match[1] as $c) {
+            $FmtV['$Category'] = $c;
+            $out .= FmtPageName($v, $pn);
+          }
+        }
+        continue;
+      }
+      $x = FmtPageName($v, $pn);
+      if (!$x) continue;
+      $out .= ($v{0} == '<') ? $x : "<$k>$x</$k>\n";
+    }
+    $out .= FmtPageName($f['item']['_end'], $pn);
+  } 
+  $out .= FmtPageName($f['feed']['_end'], $pagename);
+  foreach((array)@$f['feed']['_header'] as $fmt)
+    header(FmtPageName($fmt, $pagename));
+  print str_replace(array_keys($EntitiesTable),
+                    array_values($EntitiesTable), $out);
+}
+
+## RSSEnclosure is called in ?action=rss to generate <enclosure>
+## tags for any pages that have an attached "PageName.mp3" file.
+## The set of attachments to enclose is given by $RSSEnclosureFmt.
+function RSSEnclosure($pagename, &$page, $k) {
+  global $RSSEnclosureFmt, $UploadFileFmt, $UploadExts;
+  if (!function_exists('MakeUploadName')) return '';
+  SDV($RSSEnclosureFmt, array('{$Name}.mp3'));
+  $encl = '';
+  foreach((array)$RSSEnclosureFmt as $fmt) {
+    $path = FmtPageName($fmt, $pagename);
+    $upname = MakeUploadName($pagename, $path);
+    $filepath = FmtPageName("$UploadFileFmt/$upname", $pagename);
+    if (file_exists($filepath)) {
+      $length = filesize($filepath);
+      $type = @$UploadExts[preg_replace('/.*\\./', '', $filepath)];
+      $url = LinkUpload($pagename, 'Attach:', $path, '', '', '$LinkUrl');
+      $encl .= "<$k url='$url' length='$length' type='$type' />";
+    }
+  }
+  return $encl;
+}
+
+## Since most feeds don't understand html character entities, we
+## convert the common ones to their numeric form here.
+SDVA($EntitiesTable, array(
+  # entities defined in "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent"
+  '&nbsp;' => '&#160;', 
+  '&iexcl;' => '&#161;', 
+  '&cent;' => '&#162;', 
+  '&pound;' => '&#163;', 
+  '&curren;' => '&#164;', 
+  '&yen;' => '&#165;', 
+  '&brvbar;' => '&#166;', 
+  '&sect;' => '&#167;', 
+  '&uml;' => '&#168;', 
+  '&copy;' => '&#169;', 
+  '&ordf;' => '&#170;', 
+  '&laquo;' => '&#171;', 
+  '&not;' => '&#172;', 
+  '&shy;' => '&#173;', 
+  '&reg;' => '&#174;', 
+  '&macr;' => '&#175;', 
+  '&deg;' => '&#176;', 
+  '&plusmn;' => '&#177;', 
+  '&sup2;' => '&#178;', 
+  '&sup3;' => '&#179;', 
+  '&acute;' => '&#180;', 
+  '&micro;' => '&#181;', 
+  '&para;' => '&#182;', 
+  '&middot;' => '&#183;', 
+  '&cedil;' => '&#184;', 
+  '&sup1;' => '&#185;', 
+  '&ordm;' => '&#186;', 
+  '&raquo;' => '&#187;', 
+  '&frac14;' => '&#188;', 
+  '&frac12;' => '&#189;', 
+  '&frac34;' => '&#190;', 
+  '&iquest;' => '&#191;', 
+  '&Agrave;' => '&#192;', 
+  '&Aacute;' => '&#193;', 
+  '&Acirc;' => '&#194;', 
+  '&Atilde;' => '&#195;', 
+  '&Auml;' => '&#196;', 
+  '&Aring;' => '&#197;', 
+  '&AElig;' => '&#198;', 
+  '&Ccedil;' => '&#199;', 
+  '&Egrave;' => '&#200;', 
+  '&Eacute;' => '&#201;', 
+  '&Ecirc;' => '&#202;', 
+  '&Euml;' => '&#203;', 
+  '&Igrave;' => '&#204;', 
+  '&Iacute;' => '&#205;', 
+  '&Icirc;' => '&#206;', 
+  '&Iuml;' => '&#207;', 
+  '&ETH;' => '&#208;', 
+  '&Ntilde;' => '&#209;', 
+  '&Ograve;' => '&#210;', 
+  '&Oacute;' => '&#211;', 
+  '&Ocirc;' => '&#212;', 
+  '&Otilde;' => '&#213;', 
+  '&Ouml;' => '&#214;', 
+  '&times;' => '&#215;', 
+  '&Oslash;' => '&#216;', 
+  '&Ugrave;' => '&#217;', 
+  '&Uacute;' => '&#218;', 
+  '&Ucirc;' => '&#219;', 
+  '&Uuml;' => '&#220;', 
+  '&Yacute;' => '&#221;', 
+  '&THORN;' => '&#222;', 
+  '&szlig;' => '&#223;', 
+  '&agrave;' => '&#224;', 
+  '&aacute;' => '&#225;', 
+  '&acirc;' => '&#226;', 
+  '&atilde;' => '&#227;', 
+  '&auml;' => '&#228;', 
+  '&aring;' => '&#229;', 
+  '&aelig;' => '&#230;', 
+  '&ccedil;' => '&#231;', 
+  '&egrave;' => '&#232;', 
+  '&eacute;' => '&#233;', 
+  '&ecirc;' => '&#234;', 
+  '&euml;' => '&#235;', 
+  '&igrave;' => '&#236;', 
+  '&iacute;' => '&#237;', 
+  '&icirc;' => '&#238;', 
+  '&iuml;' => '&#239;', 
+  '&eth;' => '&#240;', 
+  '&ntilde;' => '&#241;', 
+  '&ograve;' => '&#242;', 
+  '&oacute;' => '&#243;', 
+  '&ocirc;' => '&#244;', 
+  '&otilde;' => '&#245;', 
+  '&ouml;' => '&#246;', 
+  '&divide;' => '&#247;', 
+  '&oslash;' => '&#248;', 
+  '&ugrave;' => '&#249;', 
+  '&uacute;' => '&#250;', 
+  '&ucirc;' => '&#251;', 
+  '&uuml;' => '&#252;', 
+  '&yacute;' => '&#253;', 
+  '&thorn;' => '&#254;', 
+  '&yuml;' => '&#255;', 
+  # entities defined in "http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent"
+  '&quot;' => '&#34;', 
+  #'&amp;' => '&#38;#38;', 
+  #'&lt;' => '&#38;#60;', 
+  #'&gt;' => '&#62;', 
+  '&apos;' => '&#39;', 
+  '&OElig;' => '&#338;', 
+  '&oelig;' => '&#339;', 
+  '&Scaron;' => '&#352;', 
+  '&scaron;' => '&#353;', 
+  '&Yuml;' => '&#376;', 
+  '&circ;' => '&#710;', 
+  '&tilde;' => '&#732;', 
+  '&ensp;' => '&#8194;', 
+  '&emsp;' => '&#8195;', 
+  '&thinsp;' => '&#8201;', 
+  '&zwnj;' => '&#8204;', 
+  '&zwj;' => '&#8205;', 
+  '&lrm;' => '&#8206;', 
+  '&rlm;' => '&#8207;', 
+  '&ndash;' => '&#8211;', 
+  '&mdash;' => '&#8212;', 
+  '&lsquo;' => '&#8216;', 
+  '&rsquo;' => '&#8217;', 
+  '&sbquo;' => '&#8218;', 
+  '&ldquo;' => '&#8220;', 
+  '&rdquo;' => '&#8221;', 
+  '&bdquo;' => '&#8222;', 
+  '&dagger;' => '&#8224;', 
+  '&Dagger;' => '&#8225;', 
+  '&permil;' => '&#8240;', 
+  '&lsaquo;' => '&#8249;', 
+  '&rsaquo;' => '&#8250;', 
+  '&euro;' => '&#8364;', 
+  # entities defined in "http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent"
+  '&fnof;' => '&#402;', 
+  '&Alpha;' => '&#913;', 
+  '&Beta;' => '&#914;', 
+  '&Gamma;' => '&#915;', 
+  '&Delta;' => '&#916;', 
+  '&Epsilon;' => '&#917;', 
+  '&Zeta;' => '&#918;', 
+  '&Eta;' => '&#919;', 
+  '&Theta;' => '&#920;', 
+  '&Iota;' => '&#921;', 
+  '&Kappa;' => '&#922;', 
+  '&Lambda;' => '&#923;', 
+  '&Mu;' => '&#924;', 
+  '&Nu;' => '&#925;', 
+  '&Xi;' => '&#926;', 
+  '&Omicron;' => '&#927;', 
+  '&Pi;' => '&#928;', 
+  '&Rho;' => '&#929;', 
+  '&Sigma;' => '&#931;', 
+  '&Tau;' => '&#932;', 
+  '&Upsilon;' => '&#933;', 
+  '&Phi;' => '&#934;', 
+  '&Chi;' => '&#935;', 
+  '&Psi;' => '&#936;', 
+  '&Omega;' => '&#937;', 
+  '&alpha;' => '&#945;', 
+  '&beta;' => '&#946;', 
+  '&gamma;' => '&#947;', 
+  '&delta;' => '&#948;', 
+  '&epsilon;' => '&#949;', 
+  '&zeta;' => '&#950;', 
+  '&eta;' => '&#951;', 
+  '&theta;' => '&#952;', 
+  '&iota;' => '&#953;', 
+  '&kappa;' => '&#954;', 
+  '&lambda;' => '&#955;', 
+  '&mu;' => '&#956;', 
+  '&nu;' => '&#957;', 
+  '&xi;' => '&#958;', 
+  '&omicron;' => '&#959;', 
+  '&pi;' => '&#960;', 
+  '&rho;' => '&#961;', 
+  '&sigmaf;' => '&#962;', 
+  '&sigma;' => '&#963;', 
+  '&tau;' => '&#964;', 
+  '&upsilon;' => '&#965;', 
+  '&phi;' => '&#966;', 
+  '&chi;' => '&#967;', 
+  '&psi;' => '&#968;', 
+  '&omega;' => '&#969;', 
+  '&thetasym;' => '&#977;', 
+  '&upsih;' => '&#978;', 
+  '&piv;' => '&#982;', 
+  '&bull;' => '&#8226;', 
+  '&hellip;' => '&#8230;', 
+  '&prime;' => '&#8242;', 
+  '&Prime;' => '&#8243;', 
+  '&oline;' => '&#8254;', 
+  '&frasl;' => '&#8260;', 
+  '&weierp;' => '&#8472;', 
+  '&image;' => '&#8465;', 
+  '&real;' => '&#8476;', 
+  '&trade;' => '&#8482;', 
+  '&alefsym;' => '&#8501;', 
+  '&larr;' => '&#8592;', 
+  '&uarr;' => '&#8593;', 
+  '&rarr;' => '&#8594;', 
+  '&darr;' => '&#8595;', 
+  '&harr;' => '&#8596;', 
+  '&crarr;' => '&#8629;', 
+  '&lArr;' => '&#8656;', 
+  '&uArr;' => '&#8657;', 
+  '&rArr;' => '&#8658;', 
+  '&dArr;' => '&#8659;', 
+  '&hArr;' => '&#8660;', 
+  '&forall;' => '&#8704;', 
+  '&part;' => '&#8706;', 
+  '&exist;' => '&#8707;', 
+  '&empty;' => '&#8709;', 
+  '&nabla;' => '&#8711;', 
+  '&isin;' => '&#8712;', 
+  '&notin;' => '&#8713;', 
+  '&ni;' => '&#8715;', 
+  '&prod;' => '&#8719;', 
+  '&sum;' => '&#8721;', 
+  '&minus;' => '&#8722;', 
+  '&lowast;' => '&#8727;', 
+  '&radic;' => '&#8730;', 
+  '&prop;' => '&#8733;', 
+  '&infin;' => '&#8734;', 
+  '&ang;' => '&#8736;', 
+  '&and;' => '&#8743;', 
+  '&or;' => '&#8744;', 
+  '&cap;' => '&#8745;', 
+  '&cup;' => '&#8746;', 
+  '&int;' => '&#8747;', 
+  '&there4;' => '&#8756;', 
+  '&sim;' => '&#8764;', 
+  '&cong;' => '&#8773;', 
+  '&asymp;' => '&#8776;', 
+  '&ne;' => '&#8800;', 
+  '&equiv;' => '&#8801;', 
+  '&le;' => '&#8804;', 
+  '&ge;' => '&#8805;', 
+  '&sub;' => '&#8834;', 
+  '&sup;' => '&#8835;', 
+  '&nsub;' => '&#8836;', 
+  '&sube;' => '&#8838;', 
+  '&supe;' => '&#8839;', 
+  '&oplus;' => '&#8853;', 
+  '&otimes;' => '&#8855;', 
+  '&perp;' => '&#8869;', 
+  '&sdot;' => '&#8901;', 
+  '&lceil;' => '&#8968;', 
+  '&rceil;' => '&#8969;', 
+  '&lfloor;' => '&#8970;', 
+  '&rfloor;' => '&#8971;', 
+  '&lang;' => '&#9001;', 
+  '&rang;' => '&#9002;', 
+  '&loz;' => '&#9674;', 
+  '&spades;' => '&#9824;', 
+  '&clubs;' => '&#9827;', 
+  '&hearts;' => '&#9829;', 
+  '&diams;' => '&#9830;'));
+

Added: trunk/oggdsf/website/scripts/forms.php
===================================================================
--- trunk/oggdsf/website/scripts/forms.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/forms.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,324 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2005-2007 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+*/
+
+# $InputAttrs are the attributes we allow in output tags
+SDV($InputAttrs, array('name', 'value', 'id', 'class', 'rows', 'cols', 
+  'size', 'maxlength', 'action', 'method', 'accesskey', 'multiple',
+  'checked', 'disabled', 'readonly', 'enctype', 'src', 'alt'));
+
+# Set up formatting for text, submit, hidden, radio, etc. types
+foreach(array('text', 'submit', 'hidden', 'password', 'radio', 'checkbox',
+              'reset', 'file', 'image') as $t) 
+  SDV($InputTags[$t][':html'], "<input type='$t' \$InputFormArgs />");
+SDV($InputTags['text']['class'], 'inputbox');
+SDV($InputTags['password']['class'], 'inputbox');
+SDV($InputTags['submit']['class'], 'inputbutton');
+SDV($InputTags['reset']['class'], 'inputbutton');
+SDV($InputTags['radio'][':checked'], 'checked');
+SDV($InputTags['checkbox'][':checked'], 'checked');
+
+# (:input form:)
+SDVA($InputTags['form'], array(
+  ':args' => array('action', 'method'),
+  ':html' => "<form \$InputFormArgs>",
+  'method' => 'post'));
+
+# (:input end:)
+SDV($InputTags['end'][':html'], '</form>');
+
+# (:input textarea:)
+SDVA($InputTags['textarea'], array(
+  ':content' => array('value'),
+  ':attr' => array_diff($InputAttrs, array('value')),
+  ':html' => "<textarea \$InputFormArgs>\$InputFormContent</textarea>"));
+
+# (:input image:)
+SDV($InputTags['image'][':args'], array('name', 'src', 'alt'));
+
+# (:input select:)
+SDVA($InputTags['select-option'], array(
+  ':args' => array('name', 'value', 'label'),
+  ':content' => array('label', 'value', 'name'),
+  ':attr' => array('value', 'selected'),
+  ':checked' => 'selected',
+  ':html' => "<option \$InputFormArgs>\$InputFormContent</option>"));
+SDVA($InputTags['select'], array(
+  'class' => 'inputbox',
+  ':html' => "<select \$InputSelectArgs>\$InputSelectOptions</select>"));
+
+# (:input defaults?:)
+SDVA($InputTags['default'], array(':fn' => 'InputDefault'));
+SDVA($InputTags['defaults'], array(':fn' => 'InputDefault'));
+
+##  (:input ...:) directives
+Markup('input', 'directives',
+  '/\\(:input\\s+(\\w+)(.*?):\\)/ei',
+  "InputMarkup(\$pagename, '$1', PSS('$2'))");
+
+##  (:input select:) has its own markup processing
+Markup('input-select', '<input',
+  '/\\(:input\\s+select\\s.*?:\\)(?:\\s*\\(:input\\s+select\\s.*?:\\))*/ei',
+  "InputSelect(\$pagename, 'select', PSS('$0'))");
+
+##  The 'input+sp' rule combines multiple (:input select ... :)
+##  into a single markup line (to avoid split line effects)
+Markup('input+sp', '<split', 
+  '/(\\(:input\\s+select\\s(?>.*?:\\)))\\s+(?=\\(:input\\s)/', '$1');
+
+SDV($InputFocusFmt, 
+  "<script language='javascript' type='text/javascript'><!--
+   document.getElementById('\$InputFocusId').focus();//--></script>");
+
+##  InputToHTML performs standard processing on (:input ...:) arguments,
+##  and returns the formatted HTML string.
+function InputToHTML($pagename, $type, $args, &$opt) {
+  global $InputTags, $InputAttrs, $InputValues, $FmtV,
+    $InputFocusLevel, $InputFocusId, $InputFocusFmt, $HTMLFooterFmt;
+  if (!@$InputTags[$type]) return "(:input $type $args:)";
+  ##  get input arguments
+  if (!is_array($args)) $args = ParseArgs($args);
+  ##  convert any positional arguments to named arguments
+  $posnames = @$InputTags[$type][':args'];
+  if (!$posnames) $posnames = array('name', 'value');
+  while (count($posnames) > 0 && count(@$args['']) > 0) {
+    $n = array_shift($posnames);
+    if (!isset($args[$n])) $args[$n] = array_shift($args['']);
+  }
+  ##  merge defaults for input type with arguments
+  $opt = array_merge($InputTags[$type], $args);
+  ##  convert any remaining positional args to flags
+  foreach ((array)@$opt[''] as $a) 
+    { $a = strtolower($a); if (!isset($opt[$a])) $opt[$a] = $a; }
+  if (isset($opt['name'])) {
+    $opt['name'] = preg_replace('/^\\$:/', 'ptv_', @$opt['name']);
+    $name = $opt['name'];
+    ##  set control values from $InputValues array
+    ##  radio, checkbox, select, etc. require a flag of some sort,
+    ##  others just set 'value'
+    if (isset($InputValues[$name])) {
+      $checked = @$opt[':checked'];
+      if ($checked) {
+        $opt[$checked] = in_array(@$opt['value'], (array)$InputValues[$name])
+                         ? $checked : false;
+      } else if (!isset($opt['value'])) $opt['value'] = $InputValues[$name];
+    }
+  }
+  ##  build $InputFormContent
+  $FmtV['$InputFormContent'] = '';
+  foreach((array)@$opt[':content'] as $a)
+    if (isset($opt[$a])) { $FmtV['$InputFormContent'] = $opt[$a]; break; }
+  ##  hash and store any "secure" values
+  if (@$opt['secure'] == '#') $opt['secure'] = rand();
+  if (@$opt['secure'] > '') {
+    $md5 = md5($opt['secure'] . $opt['value']);
+    @session_start(); 
+    $_SESSION['forms'][$md5] = $opt['value'];
+    $opt['value'] = $md5;
+  }
+  ##  handle focus=# option
+  $focus = @$opt['focus'];
+  if (isset($focus)
+      && (!isset($InputFocusLevel) || $focus < $InputFocusLevel)) {
+    if (!isset($opt['id'])) $opt['id'] = "wikifocus$focus";
+    $InputFocusLevel = $focus;
+    $InputFocusId = $opt['id'];
+    $HTMLFooterFmt['inputfocus'] = $InputFocusFmt;
+  }
+  ##  build $InputFormArgs from $opt
+  $attrlist = (isset($opt[':attr'])) ? $opt[':attr'] : $InputAttrs;
+  $attr = array();
+  foreach ($attrlist as $a) {
+    if (!isset($opt[$a]) || $opt[$a]===false) continue;
+    $attr[] = "$a='".str_replace("'", '&#39;', $opt[$a])."'";
+  }
+  $FmtV['$InputFormArgs'] = implode(' ', $attr);
+  return FmtPageName($opt[':html'], $pagename);
+}
+
+
+##  InputMarkup handles the (:input ...:) directive.  It either
+##  calls any function given by the :fn element of the corresponding
+##  tag, or else just returns the result of InputToHTML().
+function InputMarkup($pagename, $type, $args) {
+  global $InputTags;
+  $fn = @$InputTags[$type][':fn'];
+  if ($fn) return $fn($pagename, $type, $args);
+  return Keep(InputToHTML($pagename, $type, $args, $opt));
+}
+
+
+##  (:input default:) directive.
+function InputDefault($pagename, $type, $args) {
+  global $InputValues, $PageTextVarPatterns;
+  $args = ParseArgs($args);
+  $args[''] = (array)@$args[''];
+  $name = (isset($args['name'])) ? $args['name'] : array_shift($args['']);
+  $name = preg_replace('/^\\$:/', 'ptv_', $name);
+  $value = (isset($args['value'])) ? $args['value'] : array_shift($args['']);
+  if (!isset($InputValues[$name])) $InputValues[$name] = $value;
+  if (@$args['request']) {
+    $req = array_merge($_GET, $_POST);
+    foreach($req as $k => $v) 
+      if (!isset($InputValues[$k])) 
+        $InputValues[$k] = htmlspecialchars(stripmagic($v), ENT_NOQUOTES);
+  }
+  $source = @$args['source'];
+  if ($source) {
+    $source = MakePageName($pagename, $source);
+    $page = RetrieveAuthPage($source, 'read', false, READPAGE_CURRENT);
+    if ($page) {
+      foreach((array)$PageTextVarPatterns as $pat)
+        if (preg_match_all($pat, $page['text'], $match, PREG_SET_ORDER))
+          foreach($match as $m)
+            if (!isset($InputValues['ptv_'.$m[1]]))
+              $InputValues['ptv_'.$m[2]] = 
+                htmlspecialchars(Qualify($source, $m[3]), ENT_NOQUOTES);
+    }
+  }
+  return '';
+}
+
+
+##  (:input select ...:) is special, because we need to process a bunch of
+##  them as a single unit.
+function InputSelect($pagename, $type, $markup) {
+  global $InputTags, $InputAttrs, $FmtV;
+  preg_match_all('/\\(:input\\s+\\S+\\s+(.*?):\\)/', $markup, $match);
+  $selectopt = (array)$InputTags[$type];
+  $opt = $selectopt;
+  $optionshtml = '';
+  $optiontype = isset($InputTags["$type-option"]) 
+                ? "$type-option" : "select-option";
+  foreach($match[1] as $args) {
+    $optionshtml .= InputToHTML($pagename, $optiontype, $args, $oo);
+    $opt = array_merge($opt, $oo);
+  }
+  $attrlist = array_diff($InputAttrs, array('value'));
+  foreach($attrlist as $a) {
+    if (!isset($opt[$a]) || $opt[$a]===false) continue;
+    $attr[] = "$a='".str_replace("'", '&#39;', $opt[$a])."'";
+  }
+  $FmtV['$InputSelectArgs'] = implode(' ', $attr);
+  $FmtV['$InputSelectOptions'] = $optionshtml;
+  return Keep(FmtPageName($selectopt[':html'], $pagename));
+}
+
+
+function InputActionForm($pagename, $type, $args) {
+  global $InputAttrs;
+  $args = ParseArgs($args);
+  if (@$args['pagename']) $pagename = $args['pagename'];
+  $opt = NULL;
+  $html = InputToHTML($pagename, $type, $args, $opt);
+  foreach(preg_grep('/^[\\w$]/', array_keys($args)) as $k) {
+    if (is_array($args[$k]) || in_array($k, $InputAttrs)) continue;
+    if ($k == 'n' || $k == 'pagename') continue;
+    $html .= "<input type='hidden' name='$k' value='{$args[$k]}' />";
+  }
+  return Keep($html);
+}
+
+
+## RequestArgs is used to extract values from controls (typically
+## in $_GET and $_POST).
+function RequestArgs($req = NULL) {
+  if (is_null($req)) $req = array_merge($_GET, $_POST);
+  foreach ($req as $k => $v) $req[$k] = stripmagic($req[$k]);
+  return $req;
+}
+
+
+## Form-based authorization prompts (for use with PmWikiAuth)
+
+SDVA($InputTags['auth_form'], array(
+  ':html' => "<form action='{$_SERVER['REQUEST_URI']}' method='post' 
+    name='authform'>\$PostVars"));
+SDV($AuthPromptFmt, array(&$PageStartFmt, 'page:$SiteGroup.AuthForm',
+  "<script language='javascript' type='text/javascript'><!--
+    try { document.authform.authid.focus(); }
+    catch(e) { document.authform.authpw.focus(); } //--></script>",
+  &$PageEndFmt));
+
+## The section below handles specialized EditForm pages.
+## We don't bother to load it if we're not editing.
+
+if ($action != 'edit') return;
+
+SDV($PageEditForm, '$SiteGroup.EditForm');
+SDV($PageEditFmt, '$EditForm');
+if (@$_REQUEST['editform']) {
+  $PageEditForm=$_REQUEST['editform'];
+  $PageEditFmt='$EditForm';
+}
+$Conditions['e_preview'] = '(boolean)$_POST["preview"]';
+
+XLSDV('en', array(
+  'ak_save' => 's',
+  'ak_saveedit' => 'u',
+  'ak_preview' => 'p',
+  'ak_textedit' => ',',
+  'e_rows' => '23',
+  'e_cols' => '60'));
+
+# (:e_preview:) displays the preview of formatted text.
+Markup('e_preview', 'directives',
+  '/^\\(:e_preview:\\)/e',
+  "Keep(\$GLOBALS['FmtV']['\$PreviewText'])");
+
+# If we didn't load guiedit.php, then set (:e_guibuttons:) to
+# simply be empty.
+Markup('e_guibuttons', 'directives', '/\\(:e_guibuttons:\\)/', '');
+
+# Prevent (:e_preview:) and (:e_guibuttons:) from 
+# participating in text rendering step.
+SDV($SaveAttrPatterns['/\\(:e_(preview|guibuttons):\\)/'], ' ');
+
+SDVA($InputTags['e_form'], array(
+  ':html' => "<form action='{\$PageUrl}?action=edit' method='post'
+    \$InputFormArgs><input type='hidden' name='action' value='edit' 
+    /><input type='hidden' name='n' value='{\$FullName}' 
+    /><input type='hidden' name='basetime' value='\$EditBaseTime' 
+    />"));
+SDVA($InputTags['e_textarea'], array(
+  ':html' => "<textarea \$InputFormArgs 
+    onkeydown='if (event.keyCode==27) event.returnValue=false;' 
+    >\$EditText</textarea>",
+  'name' => 'text', 'id' => 'text', 'accesskey' => XL('ak_textedit'),
+  'rows' => XL('e_rows'), 'cols' => XL('e_cols')));
+SDVA($InputTags['e_author'], array(
+  ':html' => "<input type='text' \$InputFormArgs />",
+  'name' => 'author', 'value' => $Author));
+SDVA($InputTags['e_changesummary'], array(
+  ':html' => "<input type='text' \$InputFormArgs />",
+  'name' => 'csum', 'size' => '60', 'maxlength' => '100',
+  'value' => htmlspecialchars(stripmagic(@$_POST['csum']), ENT_QUOTES)));
+SDVA($InputTags['e_minorcheckbox'], array(
+  ':html' => "<input type='checkbox' \$InputFormArgs />",
+  'name' => 'diffclass', 'value' => 'minor'));
+if (@$_POST['diffclass']=='minor') 
+  SDV($InputTags['e_minorcheckbox']['checked'], 'checked');
+SDVA($InputTags['e_savebutton'], array(
+  ':html' => "<input type='submit' \$InputFormArgs />",
+  'name' => 'post', 'value' => ' '.XL('Save').' ', 
+  'accesskey' => XL('ak_save')));
+SDVA($InputTags['e_saveeditbutton'], array(
+  ':html' => "<input type='submit' \$InputFormArgs />",
+  'name' => 'postedit', 'value' => ' '.XL('Save and edit').' ',
+  'accesskey' => XL('ak_saveedit')));
+SDVA($InputTags['e_savedraftbutton'], array(':html' => ''));
+SDVA($InputTags['e_previewbutton'], array(
+  ':html' => "<input type='submit' \$InputFormArgs />",
+  'name' => 'preview', 'value' => ' '.XL('Preview').' ', 
+  'accesskey' => XL('ak_preview')));
+SDVA($InputTags['e_cancelbutton'], array(
+  ':html' => "<input type='submit' \$InputFormArgs />",
+  'name' => 'cancel', 'value' => ' '.XL('Cancel').' ' ));
+SDVA($InputTags['e_resetbutton'], array(
+  ':html' => "<input type='reset' \$InputFormArgs />",
+  'value' => ' '.XL('Reset').' '));
+

Added: trunk/oggdsf/website/scripts/guiedit.php
===================================================================
--- trunk/oggdsf/website/scripts/guiedit.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/guiedit.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,82 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2004-2005 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This script adds a graphical button bar to the edit page form.
+    The buttons are placed in the $GUIButtons array; each button
+    is specified by an array of five values:
+      - the position of the button relative to others (a number)
+      - the opening markup sequence
+      - the closing markup sequence
+      - the default text if none was highlighted
+      - the text of the button, either (a) HTML markup or (b) the 
+        url of a gif/jpg/png image to be used for the button 
+        (along with optional "title" text in quotes).
+
+    The buttons specified in this file are the default buttons
+    for the standard markups.  Some buttons (e.g., the attach/upload
+    button) are specified in their respective cookbook module.
+*/
+
+$HTMLHeaderFmt[] = "<script language='javascript' type='text/javascript'
+  src='\$FarmPubDirUrl/guiedit/guiedit.js'></script>\n";
+
+SDV($GUIButtonDirUrlFmt,'$FarmPubDirUrl/guiedit');
+
+SDVA($GUIButtons, array(
+  'em'       => array(100, "''", "''", '$[Emphasized]',
+                  '$GUIButtonDirUrlFmt/em.gif"$[Emphasized (italic)]"', 
+                  '$[ak_em]'),
+  'strong'   => array(110, "'''", "'''", '$[Strong]',
+                  '$GUIButtonDirUrlFmt/strong.gif"$[Strong (bold)]"',
+                  '$[ak_strong]'),
+  'pagelink' => array(200, '[[', ']]', '$[Page link]', 
+                  '$GUIButtonDirUrlFmt/pagelink.gif"$[Link to internal page]"'),
+  'extlink'  => array(210, '[[', ']]', 'http:// | $[link text]',
+                  '$GUIButtonDirUrlFmt/extlink.gif"$[Link to external page]"'),
+  'big'      => array(300, "'+", "+'", '$[Big text]',
+                  '$GUIButtonDirUrlFmt/big.gif"$[Big text]"'),
+  'small'    => array(310, "'-", "-'", '$[Small text]',
+                  '$GUIButtonDirUrlFmt/small.gif"$[Small text]"'),
+  'sup'      => array(320, "'^", "^'", '$[Superscript]',
+                  '$GUIButtonDirUrlFmt/sup.gif"$[Superscript]"'),
+  'sub'      => array(330, "'_", "_'", '$[Subscript]',
+                  '$GUIButtonDirUrlFmt/sub.gif"$[Subscript]"'),
+  'h2'       => array(400, '\\n!! ', '\\n', '$[Heading]',
+                  '$GUIButtonDirUrlFmt/h.gif"$[Heading]"'),
+  'center'   => array(410, '%25center%25', '', '',
+                  '$GUIButtonDirUrlFmt/center.gif"$[Center]"')));
+
+Markup('e_guibuttons', 'directives',
+  '/\\(:e_guibuttons:\\)/e',
+  "Keep(FmtPageName(GUIButtonCode(\$pagename), \$pagename))");
+
+function GUIButtonCode($pagename) {
+  global $GUIButtons;
+  $cmpfn = create_function('$a,$b', 'return $a[0]-$b[0];');
+  usort($GUIButtons, $cmpfn);
+  $out = "<script language='javascript' type='text/javascript'>\n";
+  foreach ($GUIButtons as $k => $g) {
+    if (!$g) continue;
+    @list($when, $mopen, $mclose, $mtext, $tag, $mkey) = $g;
+    if ($tag{0} == '<') { 
+        $out .= "document.write(\"$tag\");\n";
+        continue; 
+    }
+    if (preg_match('/^(.*\\.(gif|jpg|png))("([^"]+)")?$/', $tag, $m)) {
+      $title = (@$m[4] > '') ? "title='{$m[4]}'" : '';
+      $tag = "<img src='{$m[1]}' $title style='border:0px;' />";
+    }
+    $mopen = str_replace(array('\\', "'"), array('\\\\', "\\\\'"), $mopen);
+    $mclose = str_replace(array('\\', "'"), array('\\\\', "\\\\'"), $mclose);
+    $mtext = str_replace(array('\\', "'"), array('\\\\', "\\\\'"), $mtext);
+    $out .= 
+      "insButton(\"$mopen\", \"$mclose\", '$mtext', \"$tag\", \"$mkey\");\n";
+  }
+  $out .= '</script>';
+  return $out;
+}
+

Added: trunk/oggdsf/website/scripts/httpauth.php
===================================================================
--- trunk/oggdsf/website/scripts/httpauth.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/httpauth.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,49 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2004-2005 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This file defines an alternate authentication scheme based on the
+    HTTP Basic authentication protocol (i.e., the scheme used by default
+    in PmWiki 1).
+*/
+
+## If the webserver has already authenticated someone, then use
+## that identifier for our authorization id.  We also disable
+## the use of the browser's Basic Auth form later, since it tends
+## to confuse webservers.
+if (IsEnabled($EnableRemoteUserAuth, 1) && @$_SERVER['REMOTE_USER']) {
+  SDV($EnableHTTPBasicAuth, 0);
+  SDV($AuthId, $_SERVER['REMOTE_USER']);
+}
+
+## If the browser supplied a password, add that password to the
+## list of passwords used for authentication
+if (@$_SERVER['PHP_AUTH_PW']) {
+  @session_start();
+  @$_SESSION['authpw'][$_SERVER['PHP_AUTH_PW']]++;
+  $_REQUEST[session_name()] = 1;
+}
+
+
+## $EnableHTTPBasicAuth tells PmWikiAuth to use the browser's
+## HTTP Basic protocol prompt instead of a form-based prompt.
+if (IsEnabled($EnableHTTPBasicAuth, 1)) 
+  SDV($AuthPromptFmt, 'function:HTTPBasicAuthPrompt');
+
+## HTTPBasicAuthPrompt replaces PmWikiAuth's form-based password
+## prompt with the browser-based HTTP Basic prompt.
+function HTTPBasicAuthPrompt($pagename) {
+  global $AuthRealmFmt, $AuthDeniedFmt;
+  SDV($AuthRealmFmt,$GLOBALS['WikiTitle']);
+  SDV($AuthDeniedFmt,'A valid password is required to access this feature.');
+  $realm=FmtPageName($AuthRealmFmt,$pagename);
+  header("WWW-Authenticate: Basic realm=\"$realm\"");
+  header("Status: 401 Unauthorized");
+  header("HTTP-Status: 401 Unauthorized");
+  PrintFmt($pagename,$AuthDeniedFmt);
+  exit;
+}
+

Added: trunk/oggdsf/website/scripts/intermap.txt
===================================================================
--- trunk/oggdsf/website/scripts/intermap.txt	                        (rev 0)
+++ trunk/oggdsf/website/scripts/intermap.txt	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,8 @@
+PmWiki:		http://www.pmwiki.org/wiki/PmWiki/
+Cookbook:	http://www.pmwiki.org/wiki/Cookbook/
+Wiki:		http://www.c2.com/cgi/wiki?
+UseMod:		http://www.usemod.com/cgi-bin/wiki.pl?
+Meatball:	http://www.usemod.com/cgi-bin/mb.pl?
+Wikipedia:	http://www.wikipedia.com/wiki/
+PITS:		http://www.pmwiki.org/PITS/
+Path:            

Added: trunk/oggdsf/website/scripts/markupexpr.php
===================================================================
--- trunk/oggdsf/website/scripts/markupexpr.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/markupexpr.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,126 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2007 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This script implements "markup expressions" --  a method to
+    do simple computations and manipulations from markup.  The
+    generic form of a markup expression is "{(func arg1 arg2)}",
+    where the named function (held in the $MarkupExpr array)
+    is called with arg1 and arg2 as arguments.
+
+    Markup expressions can be nested.  For example, to strip
+    off the first five characters and convert the remainder to
+    lowercase, an author can write:
+
+        {(tolower (substr "HELLOWORLD" 5))}    # produces "world"
+
+    Some "built-in" expressions defined by this recipe include:
+        substr   - extract a portion of a string
+        ftime    - date/time formatting
+        strlen   - length of a string
+        rand     - generate a random number
+        pagename - build a pagename from a string
+        toupper  - convert string to uppercase
+        tolower  - convert string to lowercase
+        ucfirst  - convert first character to uppercase
+        ucwords  - convert first character of each word to uppercase
+        asspaced - spaceformatting of wikiwords
+
+    Custom expressions may be added by other recipes by adding
+    entries into the $MarkupExpr array.  Each entry's key is
+    the name of the function, the value is the code to be evaluated
+    for that function (similar to the way $FmtPV works).  By default,
+    any arguments for the expression are placed into the $args array:
+
+        ##  expressions like {(myfunc foo bar)}
+        $MarkupExpr['myfunc'] = 'myfunc($args[0], $args[1])';
+
+    The expression arguments are parsed using ParseArgs(), and the
+    result of this parsing is available through the $argp array:
+
+        ##  expressions like {(myfunc fmt=foo output=bar)}
+        $MarkupExpr['myfunc'] = 'myfunc($argp["fmt"], $argp["output"])';
+   
+    Finally, if the code in $MarkupExpr contains '$params', then
+    it is executed directly without any preprocessing into arguments,
+    and $params contains the entire argument string.  Note that $params
+    may contain escaped values representing quoted arguments and
+    results of other expressions; these values may be un-escaped
+    by using "preg_replace($rpat, $rrep, $params)".
+*/
+
+$RecipeInfo['MarkupExpressions']['Version'] = '2007-04-11';
+
+Markup('{(', '>{$var}',
+  '/\\{(\\(\\w+\\b.*?\\))\\}/e',
+  "MarkupExpression(\$pagename, PSS('$1'))");
+
+SDVA($MarkupExpr, array(
+  'substr' => 'call_user_func_array("substr", $args)',
+  'strlen' => 'strlen($args[0])',
+  'ftime' => 'ME_ftime(@$args[0], @$args[1], $argp)',
+  'rand'   => '($args) ? rand($args[0], $args[1]) : rand()',
+  'ucfirst' => 'ucfirst($args[0])',
+  'ucwords' => 'ucwords($args[0])',
+  'tolower' => 'strtolower($args[0])',
+  'toupper' => 'strtoupper($args[0])',
+  'asspaced' => '$GLOBALS["AsSpacedFunction"]($args[0])',
+  'pagename' => 'MakePageName($pagename, preg_replace($rpat, $rrep, $params))',
+));
+
+function MarkupExpression($pagename, $expr) {
+  global $KeepToken, $KPV, $MarkupExpr;
+  $rpat = "/$KeepToken(\\d+P)$KeepToken/e";
+  $rrep = '$KPV[\'$1\']';
+  $expr = preg_replace('/([\'"])(.*?)\\1/e', "Keep(PSS('$2'),'P')", $expr);
+  $expr = preg_replace('/\\(\\W/e', "Keep(PSS('$2'),'P')", $expr);
+  while (preg_match('/\\((\\w+)(\\s[^()]*)?\\)/', $expr, $match)) {
+    list($repl, $func, $params) = $match;
+    $code = @$MarkupExpr[$func];
+    ##  if not a valid function, save this string as-is and exit
+    if (!$code) break;
+    ##  if the code uses '$params', we just evaluate directly
+    if (strpos($code, '$params') !== false) {
+      $out = eval("return ({$code});");
+      if ($expr == $repl) { $expr = $out; break; }
+      $expr = str_replace($repl, $out, $expr);
+      continue;
+    }
+    ##  otherwise, we parse arguments into $args before evaluating
+    $argp = ParseArgs($params);
+    $x = $argp['#']; $args = array();
+    while ($x) {
+      list($k, $v) = array_splice($x, 0, 2);
+      if ($k == '' || $k == '+' || $k == '-') 
+        $args[] = $k.preg_replace($rpat, $rrep, $v);
+    }
+    ##  fix any quoted arguments
+    foreach ($argp as $k => $v)
+      if (!is_array($v)) $argp[$k] = preg_replace($rpat, $rrep, $v);
+    $out = eval("return ({$code});");
+    if ($expr == $repl) { $expr = $out; break; }
+    $expr = str_replace($repl, Keep($out, 'P'), $expr);
+  }
+  return preg_replace($rpat, $rrep, $expr);
+}
+
+##   ME_ftime handles {(ftime ...)} expressions.
+##
+function ME_ftime($arg0 = '', $arg1 = '', $argp = NULL) {
+  global $TimeFmt, $Now, $FTimeFmt;
+  if (@$argp['fmt']) $fmt = $argp['fmt']; 
+  else if (strpos($arg0, '%') !== false) { $fmt = $arg0; $arg0 = $arg1; }
+  else if (strpos($arg1, '%') !== false) $fmt = $arg1;
+  ## determine the timestamp
+  if (isset($argp['when'])) list($time, $x) = DRange($argp['when']);
+  else if ($arg0 > '') list($time, $x) = DRange($arg0);
+  else $time = $Now;
+  if (@$fmt == '') { SDV($FTimeFmt, $TimeFmt); $fmt = $FTimeFmt; }
+  ##  make sure we have %F available for ISO dates
+  $fmt = str_replace(array('%F', '%s'), array('%Y-%m-%d', $time), $fmt);
+  return strftime($fmt, $time);
+}
+

Added: trunk/oggdsf/website/scripts/notify.php
===================================================================
--- trunk/oggdsf/website/scripts/notify.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/notify.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,194 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2006 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This script enables email notifications to be sent when posts
+    are made.  It is included by default from the stdconfig.php 
+    script if $EnableNotify is set to non-zero.
+
+    Once enabled, the addresses to receive messages are configured
+    via the Site.NotifyList page.  A simple line in that page
+    such as 
+
+        notify=somebody at example.com
+
+    will cause messages to be periodically sent to "somebody at example.com"
+    listing the pages that have changed on the site since the previous
+    message was sent.  Multiple notify lines can be placed in the page,
+    and there are options to restrict the types of notifications
+    desired.  For more details, see the PmWiki.Notify page in
+    the documentation.
+
+    Several variables set defaults for this script:
+
+    $NotifyFrom - return email address to use in message.
+    $NotifyDelay - number of seconds to wait before sending mail
+        after the first post.
+    $NotifySquelch - minimum number of seconds between sending email
+        messages to each address.  Individual "notify=" lines in
+        Site.NotifyList can override this value via a custom "squelch="
+        parameter.
+    $NotifyFile - scratchpad file used to keep track of pending emails.
+    $NotifyListPageFmt - name of the NotifyList configuration page.
+    $NotifySubjectFmt - subject line for sent messages.
+    $NotifyBodyFmt - body of message to be sent.  The string '$NotifyItems'
+        is replaced with the list of posts in the email.
+    $NotifyItemFmt - the format for each post to be included in a notification.
+    $NotifyTimeFmt - the format for dates and times ($PostTime) 
+        in notification messages.
+    $NotifyHeaders - any additional message headers to be sent.
+    $NotifyParameters - any additional parameters to be passed to PHP's
+        mail() function.
+*/
+
+SDV($NotifyDelay, 0);
+SDV($NotifySquelch, 10800);
+SDV($NotifyFile, "$WorkDir/.notifylist");
+SDV($NotifyListPageFmt, '$SiteAdminGroup.NotifyList');
+SDV($NotifySubjectFmt, '[$WikiTitle] recent notify posts');
+SDV($NotifyBodyFmt, 
+  "Recent \$WikiTitle posts:\n" 
+  . "  \$ScriptUrl/$[{\$SiteGroup}/AllRecentChanges]\n\n\$NotifyItems\n");
+SDV($NotifyTimeFmt, $TimeFmt);
+SDV($NotifyItemFmt, 
+  ' * {$FullName} . . . $PostTime by {$LastModifiedBy}');
+SDV($NotifyHeaders, '');
+SDV($NotifyParameters, '');
+
+if (@$NotifyFrom)
+  $NotifyHeaders = "From: $NotifyFrom\r\n$NotifyHeaders";
+
+$EditFunctions[] = 'PostNotify';
+
+##   check if we need to do notifications
+if ($action != 'edit') NotifyCheck($pagename);
+
+
+function NotifyCheck($pagename) {
+  global $NotifyFile, $Now, $LastModTime;
+  $nfp = @fopen($NotifyFile, 'r');
+  if (!$nfp) return;
+  $nextevent = fgets($nfp);
+  fclose($nfp);
+  if ($Now < $nextevent && $LastModTime < filemtime($NotifyFile)) return;
+  register_shutdown_function('NotifyUpdate', $pagename, getcwd());
+}
+
+    
+function PostNotify($pagename, &$page, &$new) {
+  global $IsPagePosted;
+  if ($IsPagePosted) 
+    register_shutdown_function('NotifyUpdate', $pagename, getcwd());
+}
+
+
+function NotifyUpdate($pagename, $dir='') {
+  global $NotifyList, $NotifyListPageFmt, $NotifyFile, $IsPagePosted,
+    $FmtV, $NotifyTimeFmt, $NotifyItemFmt, $SearchPatterns,
+    $NotifySquelch, $NotifyDelay, $Now,
+    $NotifySubjectFmt, $NotifyBodyFmt, $NotifyHeaders, $NotifyParameters;
+
+  $abort = ignore_user_abort(true);
+  if ($dir) { flush(); chdir($dir); }
+
+  $GLOBALS['EnableRedirect'] = 0;
+
+  ##   Read in the current notify configuration
+  $pn = FmtPageName($NotifyListPageFmt, $pagename);
+  $npage = ReadPage($pn, READPAGE_CURRENT);
+  preg_match_all('/^[\s*:#->]*(notify[:=].*)/m', $npage['text'], $nlist);
+  $nlist = array_merge((array)@$NotifyList, (array)@$nlist[1]);
+  if (!$nlist) return;
+
+  ##   make sure other processes are locked out
+  Lock(2);
+
+  ##   let's load the current .notifylist table
+  $nfile = FmtPageName($NotifyFile, $pagename);
+  $nfp = @fopen($nfile, 'r');
+  if ($nfp) {
+    ##   get our current squelch and delay timestamps
+    clearstatcache();
+    $sz = filesize($nfile);
+    list($nextevent, $firstpost) = explode(' ', rtrim(fgets($nfp, $sz)));
+    ##   restore our notify array
+    $notify = unserialize(fgets($nfp, $sz));
+    fclose($nfp);
+  }
+  if (!is_array($notify)) $notify = array();
+
+  ##   if this is for a newly posted page, get its information
+  if ($IsPagePosted) {
+    $page = ReadPage($pagename, READPAGE_CURRENT);
+    $FmtV['$PostTime'] = strftime($NotifyTimeFmt, $Now);
+    $item = urlencode(FmtPageName($NotifyItemFmt, $pagename));
+    if ($firstpost < 1) $firstpost = $Now;
+  }
+
+  foreach($nlist as $n) {
+    $opt = ParseArgs($n);
+    $mailto = preg_split('/[\s,]+/', $opt['notify']);
+    if (!$mailto) continue;
+    if ($opt['squelch']) 
+      foreach($mailto as $m) $squelch[$m] = $opt['squelch'];
+    if (!$IsPagePosted) continue;
+    if ($opt['link']) {
+      $link = MakePageName($pagename, $opt['link']);
+      if (!preg_match("/(^|,)$link(,|$)/i", $page['targets'])) continue;
+    }
+    $pats = @(array)$SearchPatterns[$opt['list']];
+    if ($opt['group']) $pats[] = FixGlob($opt['group'], '$1$2.*');
+    if ($opt['name']) $pats[] = FixGlob($opt['name'], '$1*.$2');
+    if ($pats && !MatchPageNames($pagename, $pats)) continue;
+    if ($opt['trail']) {
+      $trail = ReadTrail($pagename, $opt['trail']);
+      for ($i=0; $i<count($trail); $i++) 
+        if ($trail[$i]['pagename'] == $pagename) break;
+      if ($i >= count($trail)) continue;
+    }
+    foreach($mailto as $m) { $notify[$m][] = $item; }
+  }
+
+  $nnow = time();
+  if ($nnow < $firstpost + $NotifyDelay) 
+    $nextevent = $firstpost + $NotifyDelay;
+  else {
+    $firstpost = 0;
+    $nextevent = $nnow + 86400;
+    $mailto = array_keys($notify);
+    $subject = FmtPageName($NotifySubjectFmt, $pagename);
+    $body = FmtPageName($NotifyBodyFmt, $pagename);
+    foreach ($mailto as $m) {
+      $msquelch = @$notify[$m]['lastmail'] +
+                    ((@$squelch[$m]) ? $squelch[$m] : $NotifySquelch);
+      if ($nnow < $msquelch) {
+        if ($msquelch < $nextevent && count($notify[$m])>1)
+          $nextevent = $msquelch;
+        continue;
+      }
+      unset($notify[$m]['lastmail']);
+      if (!$notify[$m]) { unset($notify[$m]); continue; }
+      $mbody = str_replace('$NotifyItems',   
+                           urldecode(implode("\n", $notify[$m])), $body);
+      if ($NotifyParameters)
+        mail($m, $subject, $mbody, $NotifyHeaders, $NotifyParameters);
+      else 
+        mail($m, $subject, $mbody, $NotifyHeaders);
+      $notify[$m] = array('lastmail' => $nnow);
+    }
+  }
+
+  ##   save the updated notify status
+  $nfp = @fopen($nfile, "w");
+  if ($nfp) {
+    fputs($nfp, "$nextevent $firstpost\n");
+    fputs($nfp, serialize($notify) . "\n");
+    fclose($nfp);
+  }
+  Lock(0);
+  return true;
+}
+

Added: trunk/oggdsf/website/scripts/pagelist.php
===================================================================
--- trunk/oggdsf/website/scripts/pagelist.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/pagelist.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,796 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2004-2007 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This script implements (:pagelist:) and friends -- it's one
+    of the nastiest scripts you'll ever encounter.  Part of the reason
+    for this is that page listings are so powerful and flexible, so
+    that adds complexity.  They're also expensive, so we have to
+    optimize them wherever we can.
+
+    The core function is FmtPageList(), which will generate a 
+    listing according to a wide variety of options.  FmtPageList takes 
+    care of initial option processing, and then calls a "FPL"
+    (format page list) function to obtain the formatted output.
+    The FPL function is chosen by the 'fmt=' option to (:pagelist:).
+
+    Each FPL function calls MakePageList() to obtain the list
+    of pages, formats the list somehow, and returns the results
+    to FmtPageList.  FmtPageList then returns the output to
+    the caller, and calls Keep() (preserves HTML) or PRR() (re-evaluate
+    as markup) as appropriate for the output being returned.
+*/
+
+## $PageIndexFile is the index file for term searches and link= option
+if (IsEnabled($EnablePageIndex, 1)) {
+  SDV($PageIndexFile, "$WorkDir/.pageindex");
+  $EditFunctions[] = 'PostPageIndex';
+}
+
+SDV($StrFoldFunction, 'strtolower');
+
+## $SearchPatterns holds patterns for list= option
+SDV($SearchPatterns['all'], array());
+SDVA($SearchPatterns['normal'], array(
+  'recent' => '!\.(All)?Recent(Changes|Uploads)$!',
+  'group' => '!\.Group(Print)?(Header|Footer|Attributes)$!',
+  'self' => str_replace('.', '\\.', "!^$pagename$!")));
+
+## $FPLFormatOpt is a list of options associated with fmt=
+## values.  'default' is used for any undefined values of fmt=.
+SDVA($FPLFormatOpt, array(
+  'default' => array('fn' => 'FPLTemplate', 'fmt' => '#default'),
+  'bygroup' => array('fn' => 'FPLTemplate', 'template' => '#bygroup',
+                     'class' => 'fplbygroup'),
+  'simple'  => array('fn' => 'FPLTemplate', 'template' => '#simple',
+                     'class' => 'fplsimple'),
+  'group'   => array('fn' => 'FPLTemplate', 'template' => '#group',
+                     'class' => 'fplgroup'),
+  'title'   => array('fn' => 'FPLTemplate', 'template' => '#title',
+                     'class' => 'fpltitle', 'order' => 'title'),
+  'count'   => array('fn' => 'FPLCountA'),
+  ));
+
+SDV($SearchResultsFmt, "<div class='wikisearch'>\$[SearchFor]
+  <div class='vspace'></div>\$MatchList
+  <div class='vspace'></div>\$[SearchFound]</div>");
+SDV($SearchQuery, str_replace('$', '&#036;', 
+  htmlspecialchars(stripmagic(@$_REQUEST['q']), ENT_NOQUOTES)));
+XLSDV('en', array(
+  'SearchFor' => 'Results of search for <em>$Needle</em>:',
+  'SearchFound' => 
+    '$MatchCount pages found out of $MatchSearched pages searched.'));
+
+SDV($PageListArgPattern, '((?:\\$:?)?\\w+)[:=]');
+
+Markup('pagelist', 'directives',
+  '/\\(:pagelist(\\s+.*?)?:\\)/ei',
+  "FmtPageList('\$MatchList', \$pagename, array('o' => PSS('$1 ')))");
+Markup('searchbox', 'directives',
+  '/\\(:searchbox(\\s.*?)?:\\)/e',
+  "SearchBox(\$pagename, ParseArgs(PSS('$1'), '$PageListArgPattern'))");
+Markup('searchresults', 'directives',
+  '/\\(:searchresults(\\s+.*?)?:\\)/ei',
+  "FmtPageList(\$GLOBALS['SearchResultsFmt'], \$pagename, 
+       array('req' => 1, 'request'=>1, 'o' => PSS('$1')))");
+
+SDV($SaveAttrPatterns['/\\(:(searchresults|pagelist)(\\s+.*?)?:\\)/i'], ' ');
+
+SDV($HandleActions['search'], 'HandleSearchA');
+SDV($HandleAuth['search'], 'read');
+SDV($ActionTitleFmt['search'], '| $[Search Results]');
+
+SDVA($PageListFilters, array(
+  'PageListCache' => 80,
+  'PageListProtect' => 90,
+  'PageListSources' => 100,
+  'PageListPasswords' => 120,
+  'PageListIf' => 140,
+  'PageListTermsTargets' => 160,
+  'PageListVariables' => 180,
+  'PageListSort' => 900,
+));
+
+foreach(array('random', 'size', 'time', 'ctime') as $o) 
+  SDV($PageListSortCmp[$o], "@(\$PCache[\$x]['$o']-\$PCache[\$y]['$o'])");
+SDV($PageListSortCmp['title'], 
+  '@strcasecmp($PCache[$x][\'=title\'], $PCache[$y][\'=title\'])');
+
+define('PAGELIST_PRE' , 1);
+define('PAGELIST_ITEM', 2);
+define('PAGELIST_POST', 4);
+
+## SearchBox generates the output of the (:searchbox:) markup.
+## If $SearchBoxFmt is defined, that is used, otherwise a searchbox
+## is generated.  Options include group=, size=, label=.
+function SearchBox($pagename, $opt) {
+  global $SearchBoxFmt, $SearchBoxOpt, $SearchQuery, $EnablePathInfo;
+  if (isset($SearchBoxFmt)) return Keep(FmtPageName($SearchBoxFmt, $pagename));
+  SDVA($SearchBoxOpt, array('size' => '40', 
+    'label' => FmtPageName('$[Search]', $pagename),
+    'value' => str_replace("'", "&#039;", $SearchQuery)));
+  $opt = array_merge((array)$SearchBoxOpt, @$_GET, (array)$opt);
+  $opt['action'] = 'search';
+  $target = (@$opt['target']) 
+            ? MakePageName($pagename, $opt['target']) : $pagename;
+  $opt['n'] = IsEnabled($EnablePathInfo, 0) ? '' : $target;
+  $out = FmtPageName(" class='wikisearch' action='\$PageUrl' method='get'>",
+                     $target);
+  foreach($opt as $k => $v) {
+    if ($v == '' || is_array($v)) continue;
+    $v = str_replace("'", "&#039;", $v);
+    $opt[$k] = $v;
+    if ($k == 'q' || $k == 'label' || $k == 'value' || $k == 'size') continue;
+    $k = str_replace("'", "&#039;", $k);
+    $out .= "<input type='hidden' name='$k' value='$v' />";
+  }
+  $out .= "<input type='text' name='q' value='{$opt['value']}' 
+    class='inputbox searchbox' size='{$opt['size']}' /><input type='submit' 
+    class='inputbutton searchbutton' value='{$opt['label']}' />";
+  return '<form '.Keep($out).'</form>';
+}
+
+
+## FmtPageList combines options from markup, request form, and url,
+## calls the appropriate formatting function, and returns the string.
+function FmtPageList($outfmt, $pagename, $opt) {
+  global $GroupPattern, $FmtV, $PageListArgPattern, 
+    $FPLFormatOpt, $FPLFunctions;
+  # get any form or url-submitted request
+  $rq = htmlspecialchars(stripmagic(@$_REQUEST['q']), ENT_NOQUOTES);
+  # build the search string
+  $FmtV['$Needle'] = $opt['o'] . ' ' . $rq;
+  # Handle "group/" at the beginning of the form-submitted request
+  if (preg_match("!^($GroupPattern(\\|$GroupPattern)*)?/!i", $rq, $match)) {
+    $opt['group'] = @$match[1];
+    $rq = substr($rq, strlen(@$match[1])+1);
+  }
+  $opt = array_merge($opt, ParseArgs($opt['o'], $PageListArgPattern));
+  # merge markup options with form and url
+  if (@$opt['request']) 
+    $opt = array_merge($opt, ParseArgs($rq, $PageListArgPattern), @$_REQUEST);
+  # non-posted blank search requests return nothing
+  if (@($opt['req'] && !$opt['-'] && !$opt[''] && !$opt['+'] && !$opt['q']))
+    return '';
+  # terms and group to be included and excluded
+  $GLOBALS['SearchIncl'] = array_merge((array)@$opt[''], (array)@$opt['+']);
+  $GLOBALS['SearchExcl'] = (array)@$opt['-'];
+  $GLOBALS['SearchGroup'] = @$opt['group'];
+  $fmt = @$opt['fmt']; if (!$fmt) $fmt = 'default';
+  $fmtopt = @$FPLFormatOpt[$fmt];
+  if (!is_array($fmtopt)) {
+    if ($fmtopt) $fmtopt = array('fn' => $fmtopt);
+    elseif (@$FPLFunctions[$fmt]) 
+      $fmtopt = array('fn' => $FPLFunctions[$fmt]);
+    else $fmtopt = $FPLFormatOpt['default'];
+  }
+  $fmtfn = @$fmtopt['fn'];
+  if (!is_callable($fmtfn)) $fmtfn = $FPLFormatOpt['default']['fn'];
+  $matches = array();
+  $opt = array_merge($fmtopt, $opt);
+  $out = $fmtfn($pagename, $matches, $opt);
+  $FmtV['$MatchCount'] = count($matches);
+  if ($outfmt != '$MatchList') 
+    { $FmtV['$MatchList'] = $out; $out = FmtPageName($outfmt, $pagename); }
+  if ($out[0] == '<') $out = Keep($out);
+  return PRR($out);
+}
+
+
+## MakePageList generates a list of pages using the specifications given
+## by $opt.
+function MakePageList($pagename, $opt, $retpages = 1) {
+  global $MakePageListOpt, $PageListFilters, $PCache;
+
+  StopWatch('MakePageList pre');
+  SDVA($MakePageListOpt, array('list' => 'default'));
+  $opt = array_merge((array)$MakePageListOpt, (array)$opt);
+  if (!@$opt['order'] && !@$opt['trail']) $opt['order'] = 'name';
+
+  ksort($opt); $opt['=key'] = md5(serialize($opt));
+
+  $itemfilters = array(); $postfilters = array();
+  asort($PageListFilters);
+  $opt['=phase'] = PAGELIST_PRE; $list=array(); $pn=NULL; $page=NULL;
+  foreach($PageListFilters as $fn => $v) {
+    $ret = $fn($list, $opt, $pagename, $page);
+    if ($ret & PAGELIST_ITEM) $itemfilters[] = $fn;
+    if ($ret & PAGELIST_POST) $postfilters[] = $fn;
+  }
+
+  StopWatch("MakePageList items count=".count($list).", filters=".implode(',',$itemfilters));
+  $opt['=phase'] = PAGELIST_ITEM;
+  $matches = array(); $opt['=readc'] = 0;
+  foreach((array)$list as $pn) {
+    $page = array();
+    foreach((array)$itemfilters as $fn) 
+      if (!$fn($list, $opt, $pn, $page)) continue 2;
+    $page['pagename'] = $page['name'] = $pn;
+    PCache($pn, $page);
+    $matches[] = $pn;
+  }
+  $list = $matches;
+  StopWatch("MakePageList post count=".count($list).", readc={$opt['=readc']}");
+
+  $opt['=phase'] = PAGELIST_POST; $pn=NULL; $page=NULL;
+  foreach((array)$postfilters as $fn) 
+    $fn($list, $opt, $pagename, $page);
+  
+  if ($retpages) 
+    for($i=0; $i<count($list); $i++)
+      $list[$i] = &$PCache[$list[$i]];
+  StopWatch('MakePageList end');
+  return $list;
+}
+
+
+function PageListProtect(&$list, &$opt, $pn, &$page) {
+  global $EnablePageListProtect;
+
+  switch ($opt['=phase']) {
+    case PAGELIST_PRE:
+      if (!IsEnabled($EnablePageListProtect, 1) && @$opt['readf'] < 1000)
+        return 0;
+      StopWatch("PageListProtect enabled");
+      $opt['=protectexclude'] = array();
+      $opt['=protectsafe'] = (array)@$opt['=protectsafe'];
+      return PAGELIST_ITEM|PAGELIST_POST;
+
+    case PAGELIST_ITEM:
+      if (@$opt['=protectsafe'][$pn]) return 1;
+      $page = RetrieveAuthPage($pn, 'ALWAYS', false, READPAGE_CURRENT);
+      $opt['=readc']++;
+      if (!$page['=auth']['read']) $opt['=protectexclude'][$pn] = 1;
+      if (!$page['=passwd']['read']) $opt['=protectsafe'][$pn] = 1; 
+      else NoCache();
+      return 1;
+
+    case PAGELIST_POST:
+      $excl = array_keys($opt['=protectexclude']);
+      $safe = array_keys($opt['=protectsafe']);
+      StopWatch("PageListProtect excluded=" .count($excl)
+                . ", safe=" . count($safe));
+      $list = array_diff($list, $excl);
+      return 1;
+  }
+}
+
+
+function PageListSources(&$list, &$opt, $pn, &$page) {
+  global $SearchPatterns;
+
+  StopWatch('PageListSources begin');
+  ## add the list= option to our list of pagename filter patterns
+  $opt['=pnfilter'] = array_merge((array)@$opt['=pnfilter'], 
+                                  (array)@$SearchPatterns[$opt['list']]);
+
+  if (@$opt['group']) $opt['=pnfilter'][] = FixGlob($opt['group'], '$1$2.*');
+  if (@$opt['name']) $opt['=pnfilter'][] = FixGlob($opt['name'], '$1*.$2');
+
+  if (@$opt['trail']) {
+    $trail = ReadTrail($pn, $opt['trail']);
+    $tlist = array();
+    foreach($trail as $tstop) {
+      $n = $tstop['pagename'];
+      $tlist[] = $n;
+      $tstop['parentnames'] = array();
+      PCache($n, $tstop);
+    }
+    foreach($trail as $tstop) 
+      $PCache[$tstop['pagename']]['parentnames'][] = 
+        @$trail[$tstop['parent']]['pagename'];
+    if (!@$opt['=cached']) $list = MatchPageNames($tlist, $opt['=pnfilter']);
+  } else if (!@$opt['=cached']) $list = ListPages($opt['=pnfilter']);
+
+  StopWatch("PageListSources end count=".count($list));
+  return 0;
+}
+
+
+function PageListPasswords(&$list, &$opt, $pn, &$page) {
+  if ($opt['=phase'] == PAGELIST_PRE)
+    return (@$opt['passwd'] > '' && !@$opt['=cached']) ? PAGELIST_ITEM : 0;
+
+  if (!$page) { $page = ReadPage($pn, READPAGE_CURRENT); $opt['=readc']++; }
+  if (!$page) return 0;
+  return (boolean)preg_grep('/^passwd/', array_keys($page));
+}
+
+
+function PageListIf(&$list, &$opt, $pn, &$page) {
+  global $Conditions, $Cursor;
+
+  ##  See if we have any "if" processing to perform
+  if ($opt['=phase'] == PAGELIST_PRE) 
+    return (@$opt['if'] > '') ? PAGELIST_ITEM : 0;
+
+  $condspec = $opt['if'];
+  $Cursor['='] = $pn;
+  $varpat = '\\{([=*]|!?[-\\w.\\/\\x80-\\xff]*)(\\$:?\\w+)\\}';
+  while (preg_match("/$varpat/", $condspec, $match)) {
+    $condspec = preg_replace("/$varpat/e", 
+                    "PVSE(PageVar(\$pn, '$2', '$1'))", $condspec);
+  }
+  if (!preg_match("/^\\s*(!?)\\s*(\\S*)\\s*(.*?)\\s*$/", $condspec, $match)) 
+    return 0;
+  list($x, $not, $condname, $condparm) = $match;
+  if (!isset($Conditions[$condname])) return 1;
+  $tf = (int)@eval("return ({$Conditions[$condname]});");
+  return (boolean)($tf xor $not);
+}
+
+
+function PageListTermsTargets(&$list, &$opt, $pn, &$page) {
+  global $FmtV;
+  static $reindex = array();
+  $fold = $GLOBALS['StrFoldFunction'];
+
+  switch ($opt['=phase']) {
+    case PAGELIST_PRE:
+      $FmtV['$MatchSearched'] = count($list);
+      $incl = array(); $excl = array();
+      foreach((array)@$opt[''] as $i) { $incl[] = $fold($i); }
+      foreach((array)@$opt['+'] as $i) { $incl[] = $fold($i); }
+      foreach((array)@$opt['-'] as $i) { $excl[] = $fold($i); }
+
+      $indexterms = PageIndexTerms($incl);
+      foreach($incl as $i) {
+        $delim = (!preg_match('/[^\\w\\x80-\\xff]/', $i)) ? '$' : '/';
+        $opt['=inclp'][] = $delim . preg_quote($i,$delim) . $delim . 'i';
+      }
+      if ($excl) 
+        $opt['=exclp'][] = '$'.implode('|', array_map('preg_quote',$excl)).'$i';
+
+      if (@$opt['link']) {
+        $link = MakePageName($pn, $opt['link']);
+        $opt['=linkp'] = "/(^|,)$link(,|$)/i";
+        $indexterms[] = " $link ";
+      }
+
+      if (@$opt['=cached']) return 0;
+      if ($indexterms) {
+        StopWatch("PageListTermsTargets begin count=".count($list));
+        $xlist = PageIndexGrep($indexterms, true);
+        $list = array_diff($list, $xlist);
+        StopWatch("PageListTermsTargets end count=".count($list));
+      }
+
+      if (@$opt['=inclp'] || @$opt['=exclp'] || @$opt['=linkp']) 
+        return PAGELIST_ITEM|PAGELIST_POST; 
+      return 0;
+
+    case PAGELIST_ITEM:
+      if (!$page) { $page = ReadPage($pn, READPAGE_CURRENT); $opt['=readc']++; }
+      if (!$page) return 0;
+      if (@$opt['=linkp'] && !preg_match($opt['=linkp'], @$page['targets'])) 
+        { $reindex[] = $pn; return 0; }
+      if (@$opt['=inclp'] || @$opt['=exclp']) {
+        $text = $fold($pn."\n".@$page['targets']."\n".@$page['text']);
+        foreach((array)@$opt['=exclp'] as $i) 
+          if (preg_match($i, $text)) return 0;
+        foreach((array)@$opt['=inclp'] as $i) 
+          if (!preg_match($i, $text)) { 
+            if ($i{0} == '$') $reindex[] = $pn;
+            return 0; 
+          }
+      }
+      return 1;
+
+    case PAGELIST_POST:
+      if ($reindex) PageIndexQueueUpdate($reindex);
+      $reindex = array();
+      return 0;
+  }
+}
+
+
+function PageListVariables(&$list, &$opt, $pn, &$page) {
+  switch ($opt['=phase']) {
+    case PAGELIST_PRE:
+      $varlist = preg_grep('/^\\$/', array_keys($opt));
+      if (!$varlist) return 0;
+      foreach($varlist as $v) {
+        list($inclp, $exclp) = GlobToPCRE($opt[$v]);
+        if ($inclp) $opt['=varinclp'][$v] = "/$inclp/i";
+        if ($exclp) $opt['=varexclp'][$v] = "/$exclp/i";
+      }
+      return PAGELIST_ITEM;
+
+    case PAGELIST_ITEM:
+      if (@$opt['=varinclp'])
+        foreach($opt['=varinclp'] as $v => $pat) 
+          if (!preg_match($pat, PageVar($pn, $v))) return 0;
+      if (@$opt['=varexclp'])
+        foreach($opt['=varexclp'] as $v => $pat) 
+           if (preg_match($pat, PageVar($pn, $v))) return 0;
+      return 1;
+  }
+}        
+
+
+function PageListSort(&$list, &$opt, $pn, &$page) {
+  global $PageListSortCmp, $PCache, $PageListSortRead;
+  SDVA($PageListSortRead, array('name' => 0, 'group' => 0, 'random' => 0,
+    'title' => 0));
+
+  switch ($opt['=phase']) {
+    case PAGELIST_PRE:
+      $ret = 0;
+      foreach(preg_split('/[\\s,|]+/', @$opt['order'], -1, PREG_SPLIT_NO_EMPTY) 
+              as $o) {
+        $ret |= PAGELIST_POST;
+        $r = '+';
+        if ($o{0} == '-') { $r = '-'; $o = substr($o, 1); }
+        $opt['=order'][$o] = $r;
+        if ($o{0} != '$' && 
+            (!isset($PageListSortRead[$o]) || $PageListSortRead[$o]))
+          $ret |= PAGELIST_ITEM;
+      }
+      StopWatch(@"PageListSort pre ret=$ret order={$opt['order']}");
+      return $ret;
+
+    case PAGELIST_ITEM:
+      if (!$page) { $page = ReadPage($pn, READPAGE_CURRENT); $opt['=readc']++; }
+      return 1;
+  }
+
+  ## case PAGELIST_POST
+  StopWatch('PageListSort begin');
+  $order = $opt['=order'];
+  if (@$order['title'])
+    foreach($list as $pn) $PCache[$pn]['=title'] = PageVar($pn, '$Title');
+  if (@$order['group'])
+    foreach($list as $pn) $PCache[$pn]['group'] = PageVar($pn, '$Group');
+  if (@$order['random']) 
+    { NoCache(); foreach($list as $pn) $PCache[$pn]['random'] = rand(); }
+  foreach(preg_grep('/^\\$/', array_keys($order)) as $o) 
+    foreach($list as $pn) 
+      $PCache[$pn][$o] = PageVar($pn, $o);
+  $code = '';
+  foreach($opt['=order'] as $o => $r) {
+    if (@$PageListSortCmp[$o]) 
+      $code .= "\$c = {$PageListSortCmp[$o]}; "; 
+    else 
+      $code .= "\$c = @strcasecmp(\$PCache[\$x]['$o'],\$PCache[\$y]['$o']); ";
+    $code .= "if (\$c) return $r\$c;\n";
+  }
+  StopWatch('PageListSort sort');
+  if ($code) 
+    uasort($list,
+           create_function('$x,$y', "global \$PCache; $code return 0;"));
+  StopWatch('PageListSort end');
+}
+
+
+function PageListCache(&$list, &$opt, $pn, &$page) {
+  global $PageListCacheDir, $LastModTime, $PageIndexFile;
+
+  if (@!$PageListCacheDir) return 0;
+  if (isset($opt['cache']) && !$opt['cache']) return 0;
+ 
+  $key = $opt['=key'];
+  $cache = "$PageListCacheDir/$key,cache"; 
+  switch ($opt['=phase']) {
+    case PAGELIST_PRE:
+      if (!file_exists($cache) || filemtime($cache) <= $LastModTime)
+        return PAGELIST_POST;
+      StopWatch("PageListCache begin load key=$key");
+      list($list, $opt['=protectsafe']) = 
+        unserialize(file_get_contents($cache));
+      $opt['=cached'] = 1;
+      StopWatch("PageListCache end load");
+      return 0;
+
+    case PAGELIST_POST:
+      StopWatch("PageListCache begin save key=$key");
+      $fp = @fopen($cache, "w");
+      if ($fp) {
+        fputs($fp, serialize(array($list, $opt['=protectsafe'])));
+        fclose($fp);
+      }
+      StopWatch("PageListCache end save");
+      return 0;
+  }
+  return 0;
+}
+
+
+## HandleSearchA performs ?action=search.  It's basically the same
+## as ?action=browse, except it takes its contents from Site.Search.
+function HandleSearchA($pagename, $level = 'read') {
+  global $PageSearchForm, $FmtV, $HandleSearchFmt, 
+    $PageStartFmt, $PageEndFmt;
+  SDV($HandleSearchFmt,array(&$PageStartFmt, '$PageText', &$PageEndFmt));
+  SDV($PageSearchForm, '$[{$SiteGroup}/Search]');
+  $form = RetrieveAuthPage($pagename, $level, true, READPAGE_CURRENT);
+  if (!$form) Abort("?unable to read $pagename");
+  PCache($pagename, $form);
+  $text = preg_replace('/\\[([=@])(.*?)\\1\\]/s', ' ', @$form['text']);
+  if (!preg_match('/\\(:searchresults(\\s.*?)?:\\)/', $text))
+    foreach((array)$PageSearchForm as $formfmt) {
+      $form = ReadPage(FmtPageName($formfmt, $pagename), READPAGE_CURRENT);
+      if ($form['text']) break;
+    }
+  $text = @$form['text'];
+  if (!$text) $text = '(:searchresults:)';
+  $FmtV['$PageText'] = MarkupToHTML($pagename,$text);
+  PrintFmt($pagename, $HandleSearchFmt);
+}
+
+
+########################################################################
+## The functions below provide different formatting options for
+## the output list, controlled by the fmt= parameter and the
+## $FPLFormatOpt hash.
+########################################################################
+
+## This helper function handles the count= parameter for extracting
+## a range of pagelist in the list.
+function CalcRange($range, $n) {
+  if ($n < 1) return array(0, 0);
+  if (strpos($range, '..') === false) {
+    if ($range > 0) return array(1, min($range, $n));
+    if ($range < 0) return array(max($n + $range + 1, 1), $n);
+    return array(1, $n);
+  }
+  list($r0, $r1) = explode('..', $range);
+  if ($r0 < 0) $r0 += $n + 1;
+  if ($r1 < 0) $r1 += $n + 1;
+  else if ($r1 == 0) $r1 = $n;
+  if ($r0 < 1 && $r1 < 1) return array($n+1, $n+1);
+  return array(max($r0, 1), max($r1, 1));
+}
+
+
+##  FPLCountA handles fmt=count
+function FPLCountA($pagename, &$matches, $opt) {
+  $matches = array_values(MakePageList($pagename, $opt, 0));
+  return count($matches);
+}
+
+
+##  FPLTemplate handles PagelistTemplates
+function FPLTemplate($pagename, &$matches, $opt) {
+  global $Cursor, $FPLTemplatePageFmt, $RASPageName, $PageListArgPattern;
+  SDV($FPLTemplatePageFmt, array('{$FullName}',
+    '{$SiteGroup}.LocalTemplates', '{$SiteGroup}.PageListTemplates'));
+
+  StopWatch("FPLTemplate begin");
+  $template = @$opt['template'];
+  if (!$template) $template = @$opt['fmt'];
+  $ttext = RetrieveAuthSection($pagename, $template, $FPLTemplatePageFmt);
+  $ttext = PVSE(Qualify($RASPageName, $ttext));
+
+  ##  save any escapes
+  $ttext = MarkupEscape($ttext);
+  ##  remove any anchor markups to avoid duplications
+  $ttext = preg_replace('/\\[\\[#[A-Za-z][-.:\\w]*\\]\\]/', '', $ttext);
+  
+  ##  extract portions of template
+  $tparts = preg_split('/\\(:(template)\\s+(\\w+)\\s*(.*?):\\)/i', $ttext, -1,
+                       PREG_SPLIT_DELIM_CAPTURE);
+
+  ##  handle (:template defaults:)
+  $i = 0;
+  while ($i < count($tparts)) {
+    if ($tparts[$i] != 'template') { $i++; continue; }
+    if ($tparts[$i+1] != 'defaults' && $tparts[$i+1] != 'default') { $i+=4; continue; }
+    $opt = array_merge(ParseArgs($tparts[$i+2], $PageListArgPattern), $opt);
+    array_splice($tparts, $i, 3);
+  }
+
+  SDVA($opt, array('class' => 'fpltemplate', 'wrap' => 'div'));
+
+  ##  get the list of pages
+  $matches = array_values(MakePageList($pagename, $opt, 0));
+  ##  extract page subset according to 'count=' parameter
+  if (@$opt['count']) {
+    list($r0, $r1) = CalcRange($opt['count'], count($matches));
+    if ($r1 < $r0) 
+      $matches = array_reverse(array_slice($matches, $r1-1, $r0-$r1+1));
+    else 
+      $matches = array_slice($matches, $r0-1, $r1-$r0+1);
+  }
+
+  $savecursor = $Cursor;
+  $pagecount = 0; $groupcount = 0; $grouppagecount = 0;
+  $pseudovars = array('{$$PageCount}' => &$pagecount, 
+                      '{$$GroupCount}' => &$groupcount, 
+                      '{$$GroupPageCount}' => &$grouppagecount);
+
+  foreach(preg_grep('/^[\\w$]/', array_keys($opt)) as $k) 
+    if (!is_array($opt[$k]))
+      $pseudovars["{\$\$$k}"] = htmlspecialchars($opt[$k], ENT_NOQUOTES);
+
+  $vk = array_keys($pseudovars);
+  $vv = array_values($pseudovars);
+
+  $lgroup = ''; $out = '';
+  foreach($matches as $i => $pn) {
+    $group = PageVar($pn, '$Group');
+    if ($group != $lgroup) { $groupcount++; $grouppagecount = 0; $lgroup = $group; }
+    $grouppagecount++; $pagecount++;
+
+    $t = 0;
+    while ($t < count($tparts)) {
+      if ($tparts[$t] != 'template') { $item = $tparts[$t]; $t++; }
+      else {
+        list($when, $control, $item) = array_slice($tparts, $t+1, 3); $t+=4;
+        if (!$control) {
+          if ($when == 'first' && $i != 0) continue;
+          if ($when == 'last' && $i != count($matches) - 1) continue;
+        } else {
+          if ($when == 'first' || !isset($last[$t])) {
+            $Cursor['<'] = $Cursor['&lt;'] = (string)@$matches[$i-1];
+            $Cursor['='] = $pn;
+            $Cursor['>'] = $Cursor['&gt;'] = (string)@$matches[$i+1];
+            $curr = str_replace($vk, $vv, $control);
+            $curr = preg_replace('/\\{(=|&[lg]t;)(\\$:?\\w+)\\}/e',
+                        "PageVar(\$pn, '$2', '$1')", $curr);
+            if ($when == 'first' && $i > 0 && $last[$t] == $curr) continue;
+            $last[$t] = $curr;
+          }
+          if ($when == 'last') {
+            $Cursor['<'] = $Cursor['&lt;'] = $pn;
+            $Cursor['='] = (string)@$matches[$i+1];
+            $Cursor['>'] = $Cursor['&gt;'] = (string)@$matches[$i+2];
+            $next = str_replace($vk, $vv, $control);
+            $next = preg_replace('/\\{(=|&[lg]t;)(\\$:?\\w+)\\}/e',
+                        "PageVar(\$pn, '$2', '$1')", $next);
+            if ($next == $last[$t] && $i != count($matches) - 1) continue;
+            $last[$t] = $next;
+          }
+        }
+      }
+      $Cursor['<'] = $Cursor['&lt;'] = (string)@$matches[$i-1];
+      $Cursor['='] = $pn;
+      $Cursor['>'] = $Cursor['&gt;'] = (string)@$matches[$i+1];
+      $item = str_replace($vk, $vv, $item);
+      $item = preg_replace('/\\{(=|&[lg]t;)(\\$:?\\w+)\\}/e',
+                  "PVSE(PageVar(\$pn, '$2', '$1'))", $item);
+      $out .= MarkupRestore($item);
+    }
+  }
+
+  $class = preg_replace('/[^-a-zA-Z0-9\\x80-\\xff]/', ' ', @$opt['class']);
+  if ($class) $class = " class='$class'";
+  $wrap = @$opt['wrap'];
+  if ($wrap != 'inline') {
+    $out = MarkupToHTML($pagename, $out, array('escape' => 0));
+    if ($wrap != 'none') $out = "<div$class>$out</div>";
+  }
+  $Cursor = $savecursor;
+  StopWatch("FPLTemplate end");
+  return $out;
+}
+
+
+########################################################################
+## The functions below optimize searches by maintaining a file of
+## words and link cross references (the "page index").
+########################################################################
+
+## PageIndexTerms($terms) takes an array of strings and returns a
+## normalized list of associated search terms.  This reduces the
+## size of the index and speeds up searches.
+function PageIndexTerms($terms) {
+  global $StrFoldFunction;
+  $w = array();
+  foreach((array)$terms as $t) {
+    $w = array_merge($w, preg_split('/[^\\w\\x80-\\xff]+/', 
+           $StrFoldFunction($t), -1, PREG_SPLIT_NO_EMPTY));
+  }
+ return $w;
+}
+
+## The PageIndexUpdate($pagelist) function updates the page index
+## file with terms and target links for the pages in $pagelist.
+## The optional $dir parameter allows this function to be called
+## via register_shutdown_function (which sometimes changes directories
+## on us).
+function PageIndexUpdate($pagelist = NULL, $dir = '') {
+  global $EnableReadOnly, $PageIndexUpdateList, $PageIndexFile, 
+    $PageIndexTime, $Now;
+  if (IsEnabled($EnableReadOnly, 0)) return;
+  $abort = ignore_user_abort(true);
+  if ($dir) { flush(); chdir($dir); }
+  if (is_null($pagelist)) 
+    { $pagelist = (array)$PageIndexUpdateList; $PageIndexUpdateList = array(); }
+  if (!$pagelist || !$PageIndexFile) return;
+  SDV($PageIndexTime, 10);
+  $c = count($pagelist); $updatecount = 0;
+  StopWatch("PageIndexUpdate begin ($c pages to update)");
+  $pagelist = (array)$pagelist;
+  $timeout = time() + $PageIndexTime;
+  $cmpfn = create_function('$a,$b', 'return strlen($b)-strlen($a);');
+  Lock(2);
+  $ofp = fopen("$PageIndexFile,new", 'w');
+  foreach($pagelist as $pn) {
+    if (@$updated[$pn]) continue;
+    @$updated[$pn]++;
+    if (time() > $timeout) continue;
+    $page = ReadPage($pn, READPAGE_CURRENT);
+    if ($page) {
+      $targets = str_replace(',', ' ', @$page['targets']);
+      $terms = PageIndexTerms(array(@$page['text'], $targets, $pn));
+      usort($terms, $cmpfn);
+      $x = '';
+      foreach($terms as $t) { if (strpos($x, $t) === false) $x .= " $t"; }
+      fputs($ofp, "$pn:$Now: $targets :$x\n");
+    }
+    $updatecount++;
+  }
+  $ifp = @fopen($PageIndexFile, 'r');
+  if ($ifp) {
+    while (!feof($ifp)) {
+      $line = fgets($ifp, 4096);
+      while (substr($line, -1, 1) != "\n" && !feof($ifp)) 
+        $line .= fgets($ifp, 4096);
+      $i = strpos($line, ':');
+      if ($i === false) continue;
+      $n = substr($line, 0, $i);
+      if (@$updated[$n]) continue;
+      fputs($ofp, $line);
+    }
+    fclose($ifp);
+  }
+  fclose($ofp);
+  if (file_exists($PageIndexFile)) unlink($PageIndexFile); 
+  rename("$PageIndexFile,new", $PageIndexFile);
+  fixperms($PageIndexFile);
+  StopWatch("PageIndexUpdate end ($updatecount updated)");
+  ignore_user_abort($abort);
+}
+
+## PageIndexQueueUpdate specifies pages to be updated in
+## the index upon shutdown (via register_shutdown function).
+function PageIndexQueueUpdate($pagelist) {
+  global $PageIndexUpdateList;
+  if (!@$PageIndexUpdateList) 
+    register_shutdown_function('PageIndexUpdate', NULL, getcwd());
+  $PageIndexUpdateList = array_merge((array)@$PageIndexUpdateList,
+                                     (array)$pagelist);
+  $c1 = count($pagelist); $c2 = count($PageIndexUpdateList);
+  StopWatch("PageIndexQueueUpdate: queued $c1 pages ($c2 total)");
+}
+
+## PageIndexGrep returns a list of pages that match the strings
+## provided.  Note that some search terms may need to be normalized
+## in order to get the desired results (see PageIndexTerms above).
+## Also note that this just works for the index; if the index is
+## incomplete, then so are the results returned by this list.
+## (MakePageList above already knows how to deal with this.)
+function PageIndexGrep($terms, $invert = false) {
+  global $PageIndexFile;
+  if (!$PageIndexFile) return array();
+  StopWatch('PageIndexGrep begin');
+  $pagelist = array();
+  $fp = @fopen($PageIndexFile, 'r');
+  if ($fp) {
+    $terms = (array)$terms;
+    while (!feof($fp)) {
+      $line = fgets($fp, 4096);
+      while (substr($line, -1, 1) != "\n" && !feof($fp))
+        $line .= fgets($fp, 4096);
+      $i = strpos($line, ':');
+      if (!$i) continue;
+      $add = true;
+      foreach($terms as $t) 
+        if (strpos($line, $t) === false) { $add = false; break; }
+      if ($add xor $invert) $pagelist[] = substr($line, 0, $i);
+    }
+    fclose($fp);
+  }
+  StopWatch('PageIndexGrep end');
+  return $pagelist;
+}
+  
+## PostPageIndex is inserted into $EditFunctions to update
+## the linkindex whenever a page is saved.
+function PostPageIndex($pagename, &$page, &$new) {
+  global $IsPagePosted;
+  if ($IsPagePosted) PageIndexQueueUpdate($pagename);
+}

Added: trunk/oggdsf/website/scripts/pagerev.php
===================================================================
--- trunk/oggdsf/website/scripts/pagerev.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/pagerev.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,143 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2004-2006 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This script defines routines for displaying page revisions.  It
+    is included by default from the stdconfig.php script.
+*/
+
+function LinkSuppress($pagename,$imap,$path,$title,$txt,$fmt=NULL) 
+  { return $txt; }
+
+SDV($DiffShow['minor'],(@$_REQUEST['minor']!='n')?'y':'n');
+SDV($DiffShow['source'],(@$_REQUEST['source']=='y')?'y':'n');
+SDV($DiffMinorFmt, ($DiffShow['minor']=='y') ?
+  "<a href='{\$PageUrl}?action=diff&amp;source=".$DiffShow['source']."&amp;minor=n'>$[Hide minor edits]</a>" :
+  "<a href='{\$PageUrl}?action=diff&amp;source=".$DiffShow['source']."&amp;minor=y'>$[Show minor edits]</a>" );
+SDV($DiffSourceFmt, ($DiffShow['source']=='y') ?
+  "<a href='{\$PageUrl}?action=diff&amp;source=n&amp;minor=".$DiffShow['minor']."'>$[Show changes to output]</a>" :
+  "<a href='{\$PageUrl}?action=diff&amp;source=y&amp;minor=".$DiffShow['minor']."'>$[Show changes to markup]</a>");
+SDV($PageDiffFmt,"<h2 class='wikiaction'>$[{\$FullName} History]</h2>
+  <p>$DiffMinorFmt - $DiffSourceFmt</p>
+  ");
+SDV($DiffStartFmt,"
+      <div class='diffbox'><div class='difftime'>\$DiffTime 
+        \$[by] <span class='diffauthor' title='\$DiffHost'>\$DiffAuthor</span> - \$DiffChangeSum</div>");
+SDV($DiffDelFmt['a'],"
+        <div class='difftype'>\$[Deleted line \$DiffLines:]</div>
+        <div class='diffdel'>");
+SDV($DiffDelFmt['c'],"
+        <div class='difftype'>\$[Changed line \$DiffLines from:]</div>
+        <div class='diffdel'>");
+SDV($DiffAddFmt['d'],"
+        <div class='difftype'>\$[Added line \$DiffLines:]</div>
+        <div class='diffadd'>");
+SDV($DiffAddFmt['c'],"</div>
+        <div class='difftype'>$[to:]</div>
+        <div class='diffadd'>");
+SDV($DiffEndDelAddFmt,"</div>");
+SDV($DiffEndFmt,"</div>");
+SDV($DiffRestoreFmt,"
+      <div class='diffrestore'><a href='{\$PageUrl}?action=edit&amp;restore=\$DiffId&amp;preview=y'>$[Restore]</a></div>");
+
+SDV($HandleActions['diff'], 'HandleDiff');
+SDV($HandleAuth['diff'], 'read');
+SDV($ActionTitleFmt['diff'], '| $[History]');
+SDV($HTMLStylesFmt['diff'], "
+  .diffbox { width:570px; border-left:1px #999999 solid; margin-top:1.33em; }
+  .diffauthor { font-weight:bold; }
+  .diffchangesum { font-weight:bold; }
+  .difftime { font-family:verdana,sans-serif; font-size:66%; 
+    background-color:#dddddd; }
+  .difftype { clear:both; font-family:verdana,sans-serif; 
+    font-size:66%; font-weight:bold; }
+  .diffadd { border-left:5px #99ff99 solid; padding-left:5px; }
+  .diffdel { border-left:5px #ffff99 solid; padding-left:5px; }
+  .diffrestore { clear:both; font-family:verdana,sans-serif; 
+    font-size:66%; margin:1.5em 0px; }
+  .diffmarkup { font-family:monospace; } ");
+
+function PrintDiff($pagename) {
+  global $DiffShow,$DiffStartFmt,$TimeFmt,$DiffDelFmt,$DiffAddFmt,
+    $DiffEndDelAddFmt,$DiffEndFmt,$DiffRestoreFmt,$FmtV, $LinkFunctions;
+  $page = ReadPage($pagename);
+  if (!$page) return;
+  krsort($page); reset($page);
+  $lf = $LinkFunctions;
+  $LinkFunctions['http:'] = 'LinkSuppress';
+  $LinkFunctions['https:'] = 'LinkSuppress';
+  foreach($page as $k=>$v) {
+    if (!preg_match("/^diff:(\d+):(\d+):?([^:]*)/",$k,$match)) continue;
+    $diffclass = $match[3];
+    if ($diffclass=='minor' && $DiffShow['minor']!='y') continue;
+    $diffgmt = $match[1]; $FmtV['$DiffTime'] = strftime($TimeFmt,$diffgmt); 
+    $diffauthor = @$page["author:$diffgmt"]; 
+    if (!$diffauthor) @$diffauthor=$page["host:$diffgmt"];
+    if (!$diffauthor) $diffauthor="unknown";
+    $FmtV['$DiffChangeSum'] = htmlspecialchars(@$page["csum:$diffgmt"]);
+    $FmtV['$DiffHost'] = @$page["host:$diffgmt"];
+    $FmtV['$DiffAuthor'] = $diffauthor;
+    $FmtV['$DiffId'] = $k; 
+    echo FmtPageName($DiffStartFmt,$pagename);
+    $difflines = explode("\n",$v."\n");
+    $in=array(); $out=array(); $dtype='';
+    foreach($difflines as $d) {
+      if ($d>'') {
+        if ($d[0]=='-' || $d[0]=='\\') continue;
+        if ($d[0]=='<') { $out[]=substr($d,2); continue; }
+        if ($d[0]=='>') { $in[]=substr($d,2); continue; }
+      }
+      if (preg_match("/^(\\d+)(,(\\d+))?([adc])(\\d+)(,(\\d+))?/",
+          $dtype,$match)) {
+        if (@$match[7]>'') {
+          $lines='lines';
+          $count=$match[1].'-'.($match[1]+$match[7]-$match[5]);
+        } elseif ($match[3]>'') {
+          $lines='lines'; $count=$match[1].'-'.$match[3];
+        } else { $lines='line'; $count=$match[1]; }
+        if ($match[4]=='a' || $match[4]=='c') {
+          $txt = str_replace('line',$lines,$DiffDelFmt[$match[4]]);
+          $FmtV['$DiffLines'] = $count;
+          echo FmtPageName($txt,$pagename);
+          if ($DiffShow['source']=='y') 
+            echo "<div class='diffmarkup'>",
+              str_replace("\n","<br />",htmlspecialchars(join("\n",$in))),
+              "</div>";
+          else echo MarkupToHTML($pagename,
+            preg_replace('/\\(:.*?:\\)/e',"Keep(PSS('$0'))",join("\n",$in)));
+        }
+        if ($match[4]=='d' || $match[4]=='c') {
+          $txt = str_replace('line',$lines,$DiffAddFmt[$match[4]]);
+          $FmtV['$DiffLines'] = $count;
+          echo FmtPageName($txt,$pagename);
+          if ($DiffShow['source']=='y') 
+            echo "<div class='diffmarkup'>",
+              str_replace("\n","<br />",htmlspecialchars(join("\n",$out))),
+              "</div>";
+          else echo MarkupToHTML($pagename,
+            preg_replace('/\\(:.*?:\\)/e',"Keep(PSS('$0'))",join("\n",$out)));
+        }
+        echo FmtPageName($DiffEndDelAddFmt,$pagename);
+      }
+      $in=array(); $out=array(); $dtype=$d;
+    }
+    echo FmtPageName($DiffEndFmt,$pagename);
+    echo FmtPageName($DiffRestoreFmt,$pagename);
+  }
+  $LinkFunctions = $lf;
+}
+
+function HandleDiff($pagename, $auth='read') {
+  global $HandleDiffFmt, $PageStartFmt, $PageDiffFmt, $PageEndFmt;
+  $page = RetrieveAuthPage($pagename, $auth, true);
+  if (!$page) { Abort("?cannot diff $pagename"); }
+  PCache($pagename, $page);
+  SDV($HandleDiffFmt,array(&$PageStartFmt,
+    &$PageDiffFmt,"<div id='wikidiff'>", 'function:PrintDiff', '</div>',
+    &$PageEndFmt));
+  PrintFmt($pagename,$HandleDiffFmt);
+}
+

Added: trunk/oggdsf/website/scripts/pgcust.php
===================================================================
--- trunk/oggdsf/website/scripts/pgcust.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/pgcust.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,39 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2002-2005 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This script enables per-page and per-group customizations in the
+    local/ subdirectory (or whatever directory is given by $LocalDir).  
+    For example, to create customizations for the 'Demo' group, place 
+    them in a file called local/Demo.php.  To customize a single page, 
+    use the full page name (e.g., local/Demo.MyPage.php).  
+    Per-page/per-group customizations can be handled at any time by adding
+	include_once("scripts/pgcust.php");
+    to config.php.  It is automatically included by scripts/stdconfig.php
+    unless $EnablePGCust is set to zero in config.php.
+
+    A page's customization is loaded first, followed by any group
+    customization.  If no page or group customizations are loaded,
+    then 'local/default.php' is loaded.  
+
+    A per-page configuration file can prevent its group's config from 
+    loading by setting $EnablePGCust=0;.  A per-page configuration file 
+    can force group customizations to be loaded first by using include_once
+    on the group customization file.
+    
+*/
+
+$f = 1;
+for($p=$pagename;$p;$p=preg_replace('/\\.*[^.]*$/','',$p)) {
+  if (!IsEnabled($EnablePGCust,1)) return;
+  if (file_exists("$LocalDir/$p.php")) 
+    { include_once("$LocalDir/$p.php"); $f=0; }
+}
+
+if ($f && IsEnabled($EnablePGCust,1) && file_exists("$LocalDir/default.php"))
+  include_once("$LocalDir/default.php");
+
+

Added: trunk/oggdsf/website/scripts/phpdiff.php
===================================================================
--- trunk/oggdsf/website/scripts/phpdiff.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/phpdiff.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,116 @@
+<?php  if (!defined('PmWiki')) exit();
+/*  
+    Copyright 2003,2004 Nils Knappmeier (nk at knappi.org)
+    Copyright 2004-2005, 2007 Patrick R. Michaud (pmichaud at pobox.com)
+
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This file implements a diff function in native PHP.  It is based
+    upon the PHPDiffEngine code written by Nils Knappmeier, who in turn
+    had used Daniel Unterberger's diff 
+    (http://www.holomind.de/phpnet/diff.php) as the basis for his code.
+
+    Pm's revision of Nils' code simply attempts to streamline it 
+    for speed (eliminate function calls and unnecessary string ops)
+    and place everything into a single file.
+
+*/
+
+## PHPDiff returns the differences between $old and $new, formatted
+## in the standard diff(1) output format.
+function PHPDiff($old, $new) 
+{
+   StopWatch("PHPDiff: begin");
+   # split the source text into arrays of lines
+   $t1 = explode("\n", $old);
+   $x = array_pop($t1); 
+   if ($x > '') $t1[] = "$x\n\\ No newline at end of file";
+   $t2 = explode("\n", $new);
+   $x = array_pop($t2); 
+   if ($x > '') $t2[] = "$x\n\\ No newline at end of file";
+
+   $t1_start = 0; $t1_end = count($t1);
+   $t2_start = 0; $t2_end = count($t2);
+
+   # stop with a common ending
+   while ($t1_start < $t1_end && $t2_start < $t2_end 
+          && $t1[$t1_end-1] == $t2[$t2_end-1]) { $t1_end--; $t2_end--; }
+
+   # skip over any common beginning
+   while ($t1_start < $t1_end && $t2_start < $t2_end 
+          && $t1[$t1_start] == $t2[$t2_start]) { $t1_start++; $t2_start++; }
+
+   # build a reverse-index array using the line as key and line number as value
+   # don't store blank lines, so they won't be targets of the shortest distance
+   # search
+   for($i = $t1_start; $i < $t1_end; $i++) if ($t1[$i]>'') $r1[$t1[$i]][] = $i;
+   for($i = $t2_start; $i < $t2_end; $i++) if ($t2[$i]>'') $r2[$t2[$i]][] = $i;
+
+   $a1 = $t1_start; $a2 = $t2_start;   # start at beginning of each list
+   $actions = array();
+
+   # walk this loop until we reach the end of one of the lists
+   while ($a1 < $t1_end && $a2 < $t2_end) {
+     # if we have a common element, save it and go to the next
+     if ($t1[$a1] == $t2[$a2]) { $actions[] = 4; $a1++; $a2++; continue; } 
+
+     # otherwise, find the shortest move (Manhattan-distance) from the
+     # current location
+     $best1 = $t1_end; $best2 = $t2_end;
+     $s1 = $a1; $s2 = $a2;
+     while(($s1 + $s2 - $a1 - $a2) < ($best1 + $best2 - $a1 - $a2)) {
+       $d = -1;
+       foreach((array)@$r1[$t2[$s2]] as $n) 
+         if ($n >= $s1) { $d = $n; break; }
+       if ($d >= $s1 && ($d + $s2 - $a1 - $a2) < ($best1 + $best2 - $a1 - $a2))
+         { $best1 = $d; $best2 = $s2; }
+       $d = -1;
+       foreach((array)@$r2[$t1[$s1]] as $n) 
+         if ($n >= $s2) { $d = $n; break; }
+       if ($d >= $s2 && ($s1 + $d - $a1 - $a2) < ($best1 + $best2 - $a1 - $a2))
+         { $best1 = $s1; $best2 = $d; }
+       $s1++; $s2++;
+     }
+     while ($a1 < $best1) { $actions[] = 1; $a1++; }  # deleted elements
+     while ($a2 < $best2) { $actions[] = 2; $a2++; }  # added elements
+  }
+
+  # we've reached the end of one list, now walk to the end of the other
+  while($a1 < $t1_end) { $actions[] = 1; $a1++; }  # deleted elements
+  while($a2 < $t2_end) { $actions[] = 2; $a2++; }  # added elements
+
+  # and this marks our ending point
+  $actions[] = 8;
+
+  # now, let's follow the path we just took and report the added/deleted
+  # elements into $out.
+  $op = 0;
+  $x0 = $x1 = $t1_start; $y0 = $y1 = $t2_start;
+  $out = array();
+  foreach($actions as $act) {
+    if ($act == 1) { $op |= $act; $x1++; continue; }
+    if ($act == 2) { $op |= $act; $y1++; continue; }
+    if ($op > 0) {
+      $xstr = ($x1 == ($x0+1)) ? $x1 : ($x0+1) . ",$x1";
+      $ystr = ($y1 == ($y0+1)) ? $y1 : ($y0+1) . ",$y1";
+      if ($op == 1) $out[] = "{$xstr}d{$y1}";
+      elseif ($op == 3) $out[] = "{$xstr}c{$ystr}";
+      while ($x0 < $x1) { $out[] = '< ' . $t1[$x0]; $x0++; }   # deleted elems
+      if ($op == 2) $out[] = "{$x1}a{$ystr}";
+      elseif ($op == 3) $out[] = '---';
+      while ($y0 < $y1) { $out[] = '> '.$t2[$y0]; $y0++; }   # added elems
+    }
+    $x1++; $x0 = $x1;
+    $y1++; $y0 = $y1;
+    $op = 0;
+  }
+  $out[] = '';
+  StopWatch("PHPDiff: end");
+  return join("\n",$out);
+}
+
+$DiffFunction = 'PHPDiff';
+

Added: trunk/oggdsf/website/scripts/prefs.php
===================================================================
--- trunk/oggdsf/website/scripts/prefs.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/prefs.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,47 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2005-2006 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This script handles per-browser preferences.  Preference settings
+    are stored in wiki pages as XLPage translations, and a cookie on
+    the browser tells PmWiki where to find the browser's preferred
+    settings.
+
+    This script looks for a ?setprefs= request parameter (e.g., in
+    a url); when it finds one it sets a 'setprefs' cookie on the browser 
+    identifying the page to be used to load browser preferences,
+    and loads the associated preferences.
+
+    If there is no ?setprefs= request, then the script uses the
+    'setprefs' cookie from the browser to load the preference settings.
+*/
+
+SDV($PrefsCookie, $CookiePrefix.'setprefs');
+SDV($PrefsCookieExpires, $Now + 60 * 60 * 24 * 365);
+$LogoutCookies[] = $PrefsCookie;
+
+$sp = '';
+if (@$_COOKIE[$PrefsCookie]) $sp = $_COOKIE[$PrefsCookie];
+if (isset($_GET['setprefs'])) {
+  $sp = $_GET['setprefs'];
+  setcookie($PrefsCookie, $sp, $PrefsCookieExpires, '/');
+}
+if ($sp && PageExists($sp)) XLPage('prefs', $sp);
+
+XLSDV('en', array(
+  'ak_view' => '',
+  'ak_edit' => 'e',
+  'ak_history' => 'h',
+  'ak_print' => '',
+  'ak_recentchanges' => 'c',
+  'ak_save' => 's',
+  'ak_saveedit' => 'u',
+  'ak_savedraft' => 'd',
+  'ak_preview' => 'p',
+  'ak_em' => '',
+  'ak_strong' => '',
+  ));
+

Added: trunk/oggdsf/website/scripts/refcount.php
===================================================================
--- trunk/oggdsf/website/scripts/refcount.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/refcount.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,121 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2004-2006 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This file does simple reference counting on pages in a PmWiki site.
+    Simply activate this script using
+        include_once('scripts/refcount.php');
+    in the config.php file and then use ?action=refcount to bring up
+    the reference count form.  The output is a table where each row
+    of the table contains a page name or link reference, the number
+    of (non-RecentChanges) pages that contain links to the page,
+    the number of RecentChanges pages with links to the page, and the
+    total number of references in all pages.
+*/
+
+SDV($PageRefCountFmt,"<h2 class='wikiaction'>Reference Count Results</h2>");
+SDV($RefCountTimeFmt," <small>%Y-%b-%d %H:%M</small>");
+SDV($HandleActions['refcount'], 'HandleRefCount');
+
+function PrintRefCount($pagename) {
+  global $GroupPattern,$NamePattern,$PageRefCountFmt,$RefCountTimeFmt;
+  $pagelist = ListPages();
+  $grouplist = array();
+  foreach($pagelist as $pname) {
+    if (!preg_match("/^($GroupPattern)[\\/.]($NamePattern)$/",$pname,$m))
+      continue;
+    $grouplist[$m[1]]=$m[1];
+  }
+  asort($grouplist);
+  $grouplist = array_merge(array('all' => 'all groups'),$grouplist);
+
+  $wlist = array('all','missing','existing','orphaned');
+  $tlist = isset($_REQUEST['tlist']) ? $_REQUEST['tlist'] : array('all');
+  $flist = isset($_REQUEST['flist']) ? $_REQUEST['flist'] : array('all');
+  $whichrefs = @$_REQUEST['whichrefs'];
+  $showrefs = @$_REQUEST['showrefs'];
+  $submit = @$_REQUEST['submit'];
+
+  echo FmtPageName($PageRefCountFmt,$pagename);
+  echo "<form method='post'><input type='hidden' action='refcount'>
+    <table cellspacing='10'><tr><td valign='top'>Show
+    <br><select name='whichrefs'>";
+  foreach($wlist as $w)
+    echo "<option ",($whichrefs==$w) ? 'selected' : ''," value='$w'>$w\n";
+  echo "</select></td><td valign='top'> page names in group<br>
+    <select name='tlist[]' multiple size='4'>";
+  foreach($grouplist as $g=>$t)
+    echo "<option ",in_array($g,$tlist) ? 'selected' : ''," value='$g'>$t\n";
+  echo "</select></td><td valign='top'> referenced from pages in<br>
+    <select name='flist[]' multiple size='4'>";
+  foreach($grouplist as $g=>$t)
+    echo "<option ",in_array($g,$flist) ? 'selected' : ''," value='$g'>$t\n";
+  echo "</select></td></tr></table>
+    <p><input type='checkbox' name='showrefs' value='checked' $showrefs>
+      Display referencing pages
+    <p><input type='submit' name='submit' value='Search'></form><p><hr>";
+
+  if ($submit) {
+    foreach($pagelist as $pname) {
+      $ref = array();
+      $page = ReadPage($pname, READPAGE_CURRENT); 
+      if (!$page) continue;
+      $tref[$pname]['time'] = $page['time'];
+      if (!in_array('all',$flist) &&
+          !in_array(FmtPageName('$Group',$pname),$flist)) continue;
+      $rc = preg_match('/RecentChanges$/',$pname);
+      foreach(explode(',',@$page['targets']) as $r) {
+        if ($r=='') continue;
+        if ($rc) @$tref[$r]['rc']++;
+        else { @$tref[$r]['page']++; @$pref[$r][$pname]++; }
+      }
+    }
+    uasort($tref,'RefCountCmp');
+    echo "<table >
+      <tr><th></th><th colspan='2'>Referring pages</th></tr>
+      <tr><th>Name / Time</th><th>All</th><th>R.C.</th></tr>";
+    reset($tref);
+    foreach($tref as $p=>$c) {
+      if (!in_array('all',$tlist) &&
+          !in_array(FmtPageName('$Group',$p),$tlist)) continue;
+      if ($whichrefs=='missing' && PageExists($p)) continue;
+      elseif ($whichrefs=='existing' && !PageExists($p)) continue;
+      elseif ($whichrefs=='orphaned' &&
+        (@$tref[$p]['page']>0 || !PageExists($p))) continue;
+      echo "<tr><td valign='top'>",LinkPage($pagename, '', $p, '', $p);
+      if (@$tref[$p]['time']) echo strftime($RefCountTimeFmt,$tref[$p]['time']);
+      if ($showrefs && is_array(@$pref[$p])) {
+        foreach($pref[$p] as $pr=>$pc) 
+          echo "<dd>", LinkPage($pagename, '', $pr, '', $pr);
+      }
+      echo "</td>";
+      echo "<td align='center' valign='top'>",@$tref[$p]['page']+0,"</td>";
+      echo "<td align='center' valign='top'>",@$tref[$p]['rc']+0,"</td>";
+      echo "</tr>";
+    }
+    echo "</table>";
+  }
+}
+
+
+function RefCountCmp($ua,$ub) {
+  if (@($ua['page']!=$ub['page'])) return @($ub['page']-$ua['page']);
+  if (@($ua['rc']!=$ub['rc'])) return @($ub['rc']-$ua['rc']);
+  return @($ub['time']-$ua['time']);
+}
+
+
+
+function HandleRefCount($pagename, $auth='read') {
+  global $HandleRefCountFmt,$PageStartFmt,$PageEndFmt;
+  $page = RetrieveAuthPage($pagename, $auth, true, READPAGE_CURRENT);
+  if (!$page) Abort('?unauthorized');
+  PCache($pagename, $page);
+  SDV($HandleRefCountFmt,array(&$PageStartFmt,
+    'function:PrintRefCount',&$PageEndFmt));
+  PrintFmt($pagename,$HandleRefCountFmt);
+}
+

Added: trunk/oggdsf/website/scripts/robots.php
===================================================================
--- trunk/oggdsf/website/scripts/robots.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/robots.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,76 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2005-2006 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This file provides various features to allow PmWiki to control
+    what web crawlers (robots) see when they visit the site.  Of course
+    it's still possible to control robots at the webserver level 
+    and via robots.txt, but this page provides some finer level
+    of control.
+
+    The $MetaRobots variable controls generation of the 
+    <meta name='robots' ... /> tag in the head of the HTML document.
+    By default $MetaRobots is set so that robots do not index pages in
+    the Site, SiteAdmin, and PmWiki groups.
+
+    The $RobotPattern variable is used to determine if the user agent
+    accessing the site is a robot, and $IsRobotAgent is set accordingly.  
+    By default this pattern identifies Googlebot, Yahoo! Slurp, msnbot, 
+    BecomeBot, and HTTrack as robots.
+
+    If the agent is deemed a robot, then the $RobotActions array is
+    checked to see if robots are allowed to perform the given action,
+    and if not the robot is immediately sent an HTTP 403 Forbidden
+    response.
+
+    If $EnableRobotCloakActions is set, then a pattern is added to
+    $FmtP to hide any "?action=" url parameters in page urls
+    generated by PmWiki for actions that robots aren't allowed to
+    access.  This can greatly reduce the load on the server by 
+    not providing the robot with links to pages that it will be 
+    forbidden to index anyway.  
+*/
+
+## $MetaRobots provides the value for the <meta name='robots' ...> tag.
+SDV($MetaRobots,
+      ($action!='browse' || !PageExists($pagename)
+        || preg_match('#^PmWiki[./](?!PmWiki$)|^Site(Admin)?[./]#', $pagename))
+      ? 'noindex,nofollow' : 'index,follow');
+if ($MetaRobots)
+  $HTMLHeaderFmt['robots'] =
+    "  <meta name='robots' content='\$MetaRobots' />\n";
+
+## $RobotPattern is used to identify robots.
+SDV($RobotPattern,'Googlebot|Slurp|msnbot|Teoma|ia_archiver|BecomeBot|HTTrack|MJ12bot|XML Sitemaps');
+SDV($IsRobotAgent, 
+  $RobotPattern && preg_match("!$RobotPattern!", @$_SERVER['HTTP_USER_AGENT']));
+if (!$IsRobotAgent) return;
+
+## $RobotActions indicates which actions a robot is allowed to perform.
+SDVA($RobotActions, array('browse' => 1, 'rss' => 1, 'dc' => 1));
+if (!@$RobotActions[$action]) {
+  $pagename = ResolvePageName($pagename);
+  if (!PageExists($pagename)) {
+    header("HTTP/1.1 404 Not Found");
+    print("<h1>Not Found</h1>");
+    exit();
+  }
+  header("HTTP/1.1 403 Forbidden");
+  print("<h1>Forbidden</h1>");
+  exit();
+}
+
+## The following removes any ?action= parameters that robots aren't
+## allowed to access.
+if (IsEnabled($EnableRobotCloakActions, 0)) {
+  $p = create_function('$a', 'return (boolean)$a;');
+  $p = join('|', array_keys(array_filter($RobotActions, $p)));
+  $FmtPV['$PageUrl'] = 
+    'PUE(($EnablePathInfo)
+         ? "\\$ScriptUrl/$group/$name"
+         : "\\$ScriptUrl?n=$group.$name")';
+  $FmtP["/(\\\$ScriptUrl[^#\"'\\s<>]+)\\?action=(?!$p)\\w+/"] = '$1';
+}

Added: trunk/oggdsf/website/scripts/simuledit.php
===================================================================
--- trunk/oggdsf/website/scripts/simuledit.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/simuledit.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,67 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2004-2006 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This file enables merging of concurrent edits, using the "diff3"
+    program available on most Unix systems to merge the edits.  If 
+    diff3 is not available or you'd like to use a different command, 
+    then set $SysMergeCmd accordingly.
+*/
+
+array_unshift($EditFunctions,'MergeSimulEdits');
+$HTMLStylesFmt['simuledit'] = ".editconflict { color:green; 
+  font-style:italic; margin-top:1.33em; margin-bottom:1.33em; }\n";
+
+function Merge($newtext,$oldtext,$pagetext) {
+  global $WorkDir,$SysMergeCmd;
+  SDV($SysMergeCmd,"/usr/bin/diff3 -L '' -L '' -L '' -m -E");
+  if (substr($newtext,-1,1)!="\n") $newtext.="\n";
+  if (substr($oldtext,-1,1)!="\n") $oldtext.="\n";
+  if (substr($pagetext,-1,1)!="\n") $pagetext.="\n";
+  $tempnew = tempnam($WorkDir,"new");
+  $tempold = tempnam($WorkDir,"old");
+  $temppag = tempnam($WorkDir,"page");
+  if ($newfp=fopen($tempnew,'w')) { fputs($newfp,$newtext); fclose($newfp); }
+  if ($oldfp=fopen($tempold,'w')) { fputs($oldfp,$oldtext); fclose($oldfp); }
+  if ($pagfp=fopen($temppag,'w')) { fputs($pagfp,$pagetext); fclose($pagfp); }
+  $mergetext = '';
+  $merge_handle = popen("$SysMergeCmd $tempnew $tempold $temppag",'r');
+  if ($merge_handle) {
+    while (!feof($merge_handle)) $mergetext .= fread($merge_handle,4096);
+    pclose($merge_handle);
+  }
+  @unlink($tempnew); @unlink($tempold); @unlink($temppag);
+  return $mergetext;
+}
+
+function MergeSimulEdits($pagename,&$page,&$new) {
+  global $Now, $EnablePost, $MessagesFmt, $WorkDir;
+  if (@!$_POST['basetime'] || !PageExists($pagename) 
+      || $page['time'] >= $Now
+      || $_POST['basetime']>=$page['time']
+      || $page['text'] == $new['text']) return;
+  $EnablePost = 0;
+  $old = array();
+  RestorePage($pagename,$page,$old,"diff:{$_POST['basetime']}");
+  $text = Merge($new['text'],$old['text'],$page['text']);
+  if ($text > '') { $new['text'] = $text; $ec = '$[EditConflict]'; }
+  else $ec = '$[EditWarning]';
+  XLSDV('en', array(
+    'EditConflict' => "The page you are
+      editing has been modified since you started editing it.
+      The modifications have been merged into the text below, 
+      you may want to verify the results of the merge before
+      pressing save.  Conflicts the system couldn't resolve are
+      bracketed by &lt;&lt;&lt;&lt;&lt;&lt;&lt; and
+      &gt;&gt;&gt;&gt;&gt;&gt;&gt;.",
+    'EditWarning' => "The page you are editing has been modified
+      since you started editing it.  If you continue, your
+      changes will overwrite any changes that others have made."));
+  $MessagesFmt[] = "<p class='editconflict'>$ec
+    (<a target='_blank' href='\$PageUrl?action=diff'>$[View changes]</a>)
+    </p>\n";
+}
+

Added: trunk/oggdsf/website/scripts/skins.php
===================================================================
--- trunk/oggdsf/website/scripts/skins.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/skins.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,147 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2004-2007 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This file implements the skin selection code for PmWiki.  Skin 
+    selection is controlled by the $Skin variable, which can also
+    be an array (in which case the first skin found is loaded).
+
+    In addition, $ActionSkin[$action] specifies other skins to be
+    searched based on the current action.
+
+*/
+
+SDV($Skin, 'pmwiki');
+SDV($ActionSkin['print'], 'print');
+SDV($FarmPubDirUrl, $PubDirUrl);
+SDV($PageLogoUrl, "$FarmPubDirUrl/skins/pmwiki/pmwiki-32.gif");
+SDVA($TmplDisplay, array('PageEditFmt' => 0));
+
+# $PageTemplateFmt is deprecated
+if (isset($PageTemplateFmt)) LoadPageTemplate($pagename,$PageTemplateFmt);
+else {
+  $x = array_merge((array)@$ActionSkin[$action], (array)$Skin);
+  SetSkin($pagename, $x);
+}
+
+SDV($PageCSSListFmt,array(
+  'pub/css/local.css' => '$PubDirUrl/css/local.css',
+  'pub/css/{$Group}.css' => '$PubDirUrl/css/{$Group}.css',
+  'pub/css/{$FullName}.css' => '$PubDirUrl/css/{$FullName}.css'));
+
+foreach((array)$PageCSSListFmt as $k=>$v) 
+  if (file_exists(FmtPageName($k,$pagename))) 
+    $HTMLHeaderFmt[] = "<link rel='stylesheet' type='text/css' href='$v' />\n";
+
+# SetSkin changes the current skin to the first available skin from 
+# the $skin array.
+function SetSkin($pagename, $skin) {
+  global $Skin, $SkinLibDirs, $SkinDir, $SkinDirUrl, 
+    $IsTemplateLoaded, $PubDirUrl, $FarmPubDirUrl, $FarmD, $GCount;
+  SDV($SkinLibDirs, array(
+    "./pub/skins/\$Skin"      => "$PubDirUrl/skins/\$Skin",
+    "$FarmD/pub/skins/\$Skin" => "$FarmPubDirUrl/skins/\$Skin"));
+  foreach((array)$skin as $sfmt) {
+    $Skin = FmtPageName($sfmt, $pagename); $GCount = 0;
+    foreach($SkinLibDirs as $dirfmt => $urlfmt) {
+      $SkinDir = FmtPageName($dirfmt, $pagename);
+      if (is_dir($SkinDir)) 
+        { $SkinDirUrl = FmtPageName($urlfmt, $pagename); break 2; }
+    }
+  }
+  if (!is_dir($SkinDir)) {
+    unset($Skin);
+    Abort("?unable to find skin from list ".implode(' ',(array)$skin));
+  }
+  $IsTemplateLoaded = 0;
+  if (file_exists("$SkinDir/$Skin.php"))
+    include_once("$SkinDir/$Skin.php");
+  else if (file_exists("$SkinDir/skin.php"))
+    include_once("$SkinDir/skin.php");
+  if ($IsTemplateLoaded) return;
+  if (file_exists("$SkinDir/$Skin.tmpl")) 
+    LoadPageTemplate($pagename, "$SkinDir/$Skin.tmpl");
+  else if (file_exists("$SkinDir/skin.tmpl"))
+    LoadPageTemplate($pagename, "$SkinDir/skin.tmpl");
+  else if (($dh = opendir($SkinDir))) {
+    while (($fname = readdir($dh)) !== false) {
+      if ($fname[0] == '.') continue;
+      if (substr($fname, -5) != '.tmpl') continue;
+      if ($IsTemplateLoaded) 
+        Abort("?unable to find unique template in $SkinDir");
+      LoadPageTemplate($pagename, "$SkinDir/$fname");
+    }
+    closedir($dh);
+  }
+  if (!$IsTemplateLoaded) Abort("Unable to load $Skin template", 'skin');
+}
+
+
+# LoadPageTemplate loads a template into $TmplFmt
+function LoadPageTemplate($pagename,$tfilefmt) {
+  global $PageStartFmt, $PageEndFmt, 
+    $EnableSkinDiag, $HTMLHeaderFmt, $HTMLFooterFmt,
+    $IsTemplateLoaded, $TmplFmt, $TmplDisplay,
+    $PageTextStartFmt, $PageTextEndFmt, $SkinDirectivesPattern;
+
+  SDV($PageTextStartFmt, "\n<div id='wikitext'>\n");
+  SDV($PageTextEndFmt, "</div>\n");
+  SDV($SkinDirectivesPattern, 
+      "[[<]!--((?:wiki|file|function|markup):.*?)--[]>]");
+
+  $sddef = array('PageEditFmt' => 0);
+  $k = implode('', file(FmtPageName($tfilefmt, $pagename)));
+
+  if (IsEnabled($EnableSkinDiag, 0)) {
+    if (!preg_match('/<!--((No)?(HT|X)MLHeader|HeaderText)-->/i', $k))
+      Abort("Skin template missing &lt;!--HTMLHeader--&gt;", 'htmlheader');
+    if (!preg_match('/<!--(No)?(HT|X)MLFooter-->/i', $k))
+      Abort("Skin template missing &lt;!--HTMLFooter--&gt;", 'htmlheader');
+  }
+
+  $sect = preg_split(
+    '#[[<]!--(/?(?:Page[A-Za-z]+Fmt|(?:HT|X)ML(?:Head|Foot)er|HeaderText|PageText).*?)--[]>]#',
+    $k, 0, PREG_SPLIT_DELIM_CAPTURE);
+  $TmplFmt['Start'] = array_merge(array('headers:'),
+    preg_split("/$SkinDirectivesPattern/s",
+      array_shift($sect),0,PREG_SPLIT_DELIM_CAPTURE));
+  $TmplFmt['End'] = array($PageTextEndFmt);
+  $ps = 'Start';
+  while (count($sect)>0) {
+    $k = array_shift($sect);
+    $v = preg_split("/$SkinDirectivesPattern/s",
+      array_shift($sect),0,PREG_SPLIT_DELIM_CAPTURE);
+    $TmplFmt[$ps][] = "<!--$k-->";
+    if ($k{0} == '/') 
+      { $TmplFmt[$ps][] = (count($v) > 1) ? $v : $v[0]; continue; }
+    @list($var, $sd) = explode(' ', $k, 2);
+    $GLOBALS[$var] = (count($v) > 1) ? $v : $v[0];
+    if ($sd > '') $sddef[$var] = $sd;
+    if ($var == 'PageText') { $ps = 'End'; }
+    if ($var == 'HTMLHeader' || $var == 'XMLHeader') 
+      $TmplFmt[$ps][] = &$HTMLHeaderFmt; 
+    if ($var == 'HTMLFooter' || $var == 'XMLFooter') 
+      $TmplFmt[$ps][] = &$HTMLFooterFmt; 
+    ##   <!--HeaderText--> deprecated, 2.1.16
+    if ($var == 'HeaderText') { $TmplFmt[$ps][] = &$HTMLHeaderFmt; }
+    $TmplFmt[$ps][$var] =& $GLOBALS[$var];
+  }
+  array_push($TmplFmt['Start'], $PageTextStartFmt);
+  $PageStartFmt = 'function:PrintSkin Start';
+  $PageEndFmt = 'function:PrintSkin End';
+  $IsTemplateLoaded = 1;
+  SDVA($TmplDisplay, $sddef);
+}
+
+# This function is called to print a portion of the skin template
+# according to the settings in $TmplDisplay.
+function PrintSkin($pagename, $arg) {
+  global $TmplFmt, $TmplDisplay;
+  foreach ($TmplFmt[$arg] as $k => $v) 
+    if (!isset($TmplDisplay[$k]) || $TmplDisplay[$k])
+      PrintFmt($pagename, $v);
+}
+

Added: trunk/oggdsf/website/scripts/stdconfig.php
===================================================================
--- trunk/oggdsf/website/scripts/stdconfig.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/stdconfig.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,89 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2002-2007 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This file allows features to be easily enabled/disabled in config.php.
+    Simply set variables for the features to be enabled/disabled in config.php
+    before including this file.  For example:
+        $EnableQAMarkup=0;                      #disable Q: and A: tags
+        $EnableWikiStyles=1;                    #include default wikistyles
+    Each feature has a default setting, if the corresponding $Enable
+    variable is not set then you get the default.
+
+    To avoid processing any of the features of this file, set 
+        $EnableStdConfig = 0;
+    in config.php.
+*/
+
+$pagename = ResolvePageName($pagename);
+
+if (!IsEnabled($EnableStdConfig,1)) return;
+
+if (!function_exists('session_start') && IsEnabled($EnableRequireSession, 1))
+  Abort('PHP is lacking session support', 'session');
+
+if (IsEnabled($EnablePGCust,1))
+  include_once("$FarmD/scripts/pgcust.php");
+
+if (IsEnabled($EnableRobotControl,1))
+  include_once("$FarmD/scripts/robots.php");
+
+if (IsEnabled($EnableCaches, 1))
+  include_once("$FarmD/scripts/caches.php");
+
+## Scripts that are part of a standard PmWiki distribution.
+if (IsEnabled($EnableAuthorTracking,1)) 
+  include_once("$FarmD/scripts/author.php");
+if (IsEnabled($EnablePrefs, 1))
+  include_once("$FarmD/scripts/prefs.php");
+if (IsEnabled($EnableSimulEdit, 1))
+  include_once("$FarmD/scripts/simuledit.php");
+if (IsEnabled($EnableDrafts, 0))
+  include_once("$FarmD/scripts/draft.php");        # after simuledit + prefs
+if (IsEnabled($EnableSkinLayout,1))
+  include_once("$FarmD/scripts/skins.php");        # must come after prefs
+if (@$Transition || IsEnabled($EnableTransitions, 0))
+  include_once("$FarmD/scripts/transition.php");   # must come after skins
+if (@$LinkWikiWords || IsEnabled($EnableWikiWords, 0))
+  include_once("$FarmD/scripts/wikiwords.php");    # must come before stdmarkup
+if (IsEnabled($EnableStdMarkup,1))
+  include_once("$FarmD/scripts/stdmarkup.php");    # must come after transition
+if ($action=='diff' && @!$HandleActions['diff'])
+  include_once("$FarmD/scripts/pagerev.php");
+if (IsEnabled($EnableWikiTrails,1))
+  include_once("$FarmD/scripts/trails.php");
+if (IsEnabled($EnableWikiStyles,1))
+  include_once("$FarmD/scripts/wikistyles.php");
+if (IsEnabled($EnableMarkupExpressions, 1) 
+    && !function_exists('MarkupExpression'))
+  include_once("$FarmD/scripts/markupexpr.php");
+if (IsEnabled($EnablePageList,1))
+  include_once("$FarmD/scripts/pagelist.php");
+if (IsEnabled($EnableVarMarkup,1))
+  include_once("$FarmD/scripts/vardoc.php");
+if (!function_exists(@$DiffFunction)) 
+  include_once("$FarmD/scripts/phpdiff.php");
+if ($action=='crypt')
+  include_once("$FarmD/scripts/crypt.php");
+if ($action=='edit' && IsEnabled($EnableGUIButtons,0))
+  include_once("$FarmD/scripts/guiedit.php");
+if (IsEnabled($EnableForms,1))                     
+  include_once("$FarmD/scripts/forms.php");       # must come after prefs
+if (IsEnabled($EnableUpload,0))
+  include_once("$FarmD/scripts/upload.php");      # must come after forms
+if (IsEnabled($EnableBlocklist, 0))
+  include_once("$FarmD/scripts/blocklist.php");
+if (IsEnabled($EnableNotify,0))
+  include_once("$FarmD/scripts/notify.php");
+if (IsEnabled($EnableDiag,0)) 
+  include_once("$FarmD/scripts/diag.php");
+
+if (IsEnabled($EnableUpgradeCheck,1)) {
+  SDV($StatusPageName, "$SiteAdminGroup.Status");
+  $page = ReadPage($StatusPageName, READPAGE_CURRENT);
+  if (@$page['updatedto'] != $VersionNum) 
+    { $action = 'upgrade'; include_once("$FarmD/scripts/upgrades.php"); }
+}

Added: trunk/oggdsf/website/scripts/stdmarkup.php
===================================================================
--- trunk/oggdsf/website/scripts/stdmarkup.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/stdmarkup.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,490 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2004-2007 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This script defines PmWiki's standard markup.  It is automatically
+    included from stdconfig.php unless $EnableStdMarkup==0.
+
+    Each call to Markup() below adds a new rule to PmWiki's translation
+    engine (unless a rule with the same name has already been defined).  
+    The form of the call is Markup($id,$where,$pat,$rep); 
+    $id is a unique name for the rule, $where is the position of the rule
+    relative to another rule, $pat is the pattern to look for, and
+    $rep is the string to replace it with.
+*/
+
+## first we preserve text in [=...=] and [@...@]
+function PreserveText($sigil, $text, $lead) {
+  if ($sigil=='=') return $lead.Keep($text);
+  if (strpos($text, "\n")===false) 
+    return "$lead<code class='escaped'>".Keep($text)."</code>";
+  $text = preg_replace("/\n[^\\S\n]+$/", "\n", $text);
+  if ($lead == "" || $lead == "\n") 
+    return "$lead<pre class='escaped'>".Keep($text)."</pre>";
+  return "$lead<:pre,1>".Keep($text);
+}
+
+Markup('[=','_begin',"/(\n[^\\S\n]*)?\\[([=@])(.*?)\\2\\]/se",
+    "PreserveText('$2', PSS('$3'), '$1')");
+Markup('restore','<_end',"/$KeepToken(\\d.*?)$KeepToken/e",
+    '$GLOBALS[\'KPV\'][\'$1\']');
+Markup('<:', '>restore',
+  '/<:[^>]*>/', '');
+Markup('<vspace>', '<restore', 
+  '/<vspace>/', 
+  "<div class='vspace'></div>");
+Markup('<vspace><p>', '<<vspace>',
+  "/<vspace><p\\b(([^>]*)(\\s)class=(['\"])([^>]*?)\\4)?/",
+  "<p$2 class='vspace$3$5'");
+
+## remove carriage returns before preserving text
+Markup('\\r','<[=','/\\r/','');
+
+# $[phrase] substitutions
+Markup('$[phrase]', '>[=',
+  '/\\$\\[(?>([^\\]]+))\\]/e', "NoCache(XL(PSS('$1')))");
+
+# {$var} substitutions
+Markup('{$var}', '>$[phrase]',
+  '/\\{(\\*|!?[-\\w.\\/\\x80-\\xff]*)(\\$:?\\w+)\\}/e', 
+  "PRR(PVSE(PageVar(\$pagename, '$2', '$1')))");
+
+# invisible (:textvar:...:) definition
+Markup('textvar:', '<split',
+  '/\\(:\\w[-\\w]*:(?!\\)).*?:\\)/s', '');
+
+## handle relative text vars in includes
+if (IsEnabled($EnableRelativePageVars, 0)) 
+  SDV($QualifyPatterns["/\\{([-\\w\\x80-\\xfe]*)(\\$:?\\w+\\})/e"], 
+    "'{' . ('$1' ? MakePageName(\$pagename, '$1') : \$pagename) . '$2'");
+
+## character entities
+Markup('&','<if','/&amp;(?>([A-Za-z0-9]+|#\\d+|#[xX][A-Fa-f0-9]+));/',
+  '&$1;');
+Markup('&amp;amp;', '<&', '/&amp;amp;/', Keep('&amp;'));
+
+
+## (:if:)/(:elseif:)/(:else:)
+Markup('if', 'fulltext',
+  "/ \\(:if (?:end)? \\b[^\n]*?:\\)
+     .*?
+     (?: \\(: (?:if|ifend) \\s* :\\)
+     |   (?=\\(:(?:if|ifend)\\b[^\n]*?:\\) | $)
+     )
+   /seix",
+  "CondText2(\$pagename, PSS('$0'))");
+
+function CondText2($pagename, $text) {
+  global $Conditions;
+  $parts = preg_split('/\\(:(?:ifend|if|else *if|else)\\b\\s*(.*?)\\s*:\\)/', 
+                      $text, -1, PREG_SPLIT_DELIM_CAPTURE);
+  $x = array_shift($parts);
+  while ($parts) {
+    list($condspec, $condtext) = array_splice($parts, 0, 2);
+    if (!preg_match("/^\\s*(!?)\\s*(\\S*)\\s*(.*?)\\s*$/", $condspec, $match)) continue;
+    list($x, $not, $condname, $condparm) = $match;
+    if (!isset($Conditions[$condname])) return $condtext;
+    $tf = @eval("return ({$Conditions[$condname]});");
+    if ($tf xor $not) return $condtext;
+  }
+  return '';
+}
+
+
+## (:include:)
+Markup('include', '>if',
+  '/\\(:include\\s+(\\S.*?):\\)/ei',
+  "PRR(IncludeText(\$pagename, PSS('$1')))");
+
+## (:redirect:)
+Markup('redirect', '<include',
+  '/\\(:redirect\\s+(\\S.*?):\\)/ei',
+  "RedirectMarkup(\$pagename, PSS('$1'))");
+
+$SaveAttrPatterns['/\\(:(if|include|redirect)(\\s.*?)?:\\)/i'] = ' ';
+
+## GroupHeader/GroupFooter handling
+Markup('nogroupheader', '>include',
+  '/\\(:nogroupheader:\\)/ei',
+  "PZZ(\$GLOBALS['GroupHeaderFmt']='')");
+Markup('nogroupfooter', '>include',
+  '/\\(:nogroupfooter:\\)/ei',
+  "PZZ(\$GLOBALS['GroupFooterFmt']='')");
+Markup('groupheader', '>nogroupheader',
+  '/\\(:groupheader:\\)/ei',
+  "PRR(FmtPageName(\$GLOBALS['GroupHeaderFmt'],\$pagename))");
+Markup('groupfooter','>nogroupfooter',
+  '/\\(:groupfooter:\\)/ei',
+  "PRR(FmtPageName(\$GLOBALS['GroupFooterFmt'],\$pagename))");
+
+## (:nl:)
+Markup('nl0','<split',"/([^\n])(?>(?:\\(:nl:\\))+)([^\n])/i","$1\n$2");
+Markup('nl1','>nl0',"/\\(:nl:\\)/i",'');
+
+## \\$  (end of line joins)
+Markup('\\$','>nl1',"/\\\\(?>(\\\\*))\n/e",
+  "str_repeat('<br />',strlen('$1'))");
+
+## Remove one <:vspace> after !headings
+Markup('!vspace', '>\\$', "/^(!(?>[^\n]+)\n)<:vspace>/m", '$1');
+
+## (:noheader:),(:nofooter:),(:notitle:)...
+Markup('noheader', 'directives',
+  '/\\(:noheader:\\)/ei',
+  "SetTmplDisplay('PageHeaderFmt',0)");
+Markup('nofooter', 'directives',
+  '/\\(:nofooter:\\)/ei',
+  "SetTmplDisplay('PageFooterFmt',0)");
+Markup('notitle', 'directives',
+  '/\\(:notitle:\\)/ei',
+  "SetTmplDisplay('PageTitleFmt',0)");
+Markup('noleft', 'directives',
+  '/\\(:noleft:\\)/ei',
+  "SetTmplDisplay('PageLeftFmt',0)");
+Markup('noright', 'directives',
+  '/\\(:noright:\\)/ei',
+  "SetTmplDisplay('PageRightFmt',0)");
+Markup('noaction', 'directives',
+  '/\\(:noaction:\\)/ei',
+  "SetTmplDisplay('PageActionFmt',0)");
+
+## (:spacewikiwords:)
+Markup('spacewikiwords', 'directives',
+  '/\\(:(no)?spacewikiwords:\\)/ei',
+  "PZZ(\$GLOBALS['SpaceWikiWords']=('$1'!='no'))");
+
+## (:linkwikiwords:)
+Markup('linkwikiwords', 'directives',
+  '/\\(:(no)?linkwikiwords:\\)/ei',
+  "PZZ(\$GLOBALS['LinkWikiWords']=('$1'!='no'))");
+
+## (:linebreaks:)
+Markup('linebreaks', 'directives',
+  '/\\(:(no)?linebreaks:\\)/ei',
+  "PZZ(\$GLOBALS['HTMLPNewline'] = ('$1'!='no') ? '<br  />' : '')");
+
+## (:messages:)
+Markup('messages', 'directives',
+  '/^\\(:messages:\\)/ei',
+  "'<:block>'.Keep(
+    FmtPageName(implode('',(array)\$GLOBALS['MessagesFmt']), \$pagename))");
+
+## (:comment:)
+Markup('comment', 'directives', '/\\(:comment .*?:\\)/i', '');
+
+## (:title:)
+Markup('title','directives',
+  '/\\(:title\\s(.*?):\\)/ei',
+  "PZZ(PCache(\$pagename, 
+         \$zz=array('title' => SetProperty(\$pagename, 'title', PSS('$1')))))");
+
+## (:keywords:), (:description:)
+Markup('keywords', 'directives', 
+  "/\\(:keywords?\\s+(.+?):\\)/ei",
+  "PZZ(SetProperty(\$pagename, 'keywords', PSS('$1'), ', '))");
+Markup('description', 'directives',
+  "/\\(:description\\s+(.+?):\\)/ei",
+  "PZZ(SetProperty(\$pagename, 'description', PSS('$1'), '\n'))");
+$HTMLHeaderFmt['meta'] = 'function:PrintMetaTags';
+function PrintMetaTags($pagename, $args) {
+  global $PCache;
+  foreach(array('keywords', 'description') as $n) {
+    foreach((array)@$PCache[$pagename]["=p_$n"] as $v) {
+      $v = str_replace("'", '&#039;', $v);
+      print "<meta name='$n' content='$v' />\n";
+    }
+  }
+}
+
+#### inline markups ####
+## ''emphasis''
+Markup("''",'inline',"/''(.*?)''/",'<em>$1</em>');
+
+## '''strong'''
+Markup("'''","<''","/'''(.*?)'''/",'<strong>$1</strong>');
+
+## '''''strong emphasis'''''
+Markup("'''''","<'''","/'''''(.*?)'''''/",'<strong><em>$1</em></strong>');
+
+## @@code@@
+Markup('@@','inline','/@@(.*?)@@/','<code>$1</code>');
+
+## '+big+', '-small-'
+Markup("'+","<'''''","/'\\+(.*?)\\+'/",'<big>$1</big>');
+Markup("'-","<'''''","/'\\-(.*?)\\-'/",'<small>$1</small>');
+
+## '^superscript^', '_subscript_'
+Markup("'^","<'''''","/'\\^(.*?)\\^'/",'<sup>$1</sup>');
+Markup("'_","<'''''","/'_(.*?)_'/",'<sub>$1</sub>');
+
+## [+big+], [-small-]
+Markup('[+','inline','/\\[(([-+])+)(.*?)\\1\\]/e',
+  "'<span style=\'font-size:'.(round(pow(6/5,$2strlen('$1'))*100,0)).'%\'>'.
+    PSS('$3</span>')");
+
+## {+ins+}, {-del-}
+Markup('{+','inline','/\\{\\+(.*?)\\+\\}/','<ins>$1</ins>');
+Markup('{-','inline','/\\{-(.*?)-\\}/','<del>$1</del>');
+
+## [[<<]] (break)
+Markup('[[<<]]','inline','/\\[\\[&lt;&lt;\\]\\]/',"<br clear='all' />");
+
+###### Links ######
+## [[free links]]
+Markup('[[','links',"/(?>\\[\\[\\s*(.*?)\\]\\])($SuffixPattern)/e",
+  "Keep(MakeLink(\$pagename,PSS('$1'),NULL,'$2'),'L')");
+
+## [[!Category]]
+SDV($CategoryGroup,'Category');
+SDV($LinkCategoryFmt,"<a class='categorylink' href='\$LinkUrl'>\$LinkText</a>");
+Markup('[[!','<[[','/\\[\\[!(.*?)\\]\\]/e',
+  "Keep(MakeLink(\$pagename,PSS('$CategoryGroup/$1'),NULL,'',\$GLOBALS['LinkCategoryFmt']),'L')");
+# This is a temporary workaround for blank category pages.
+# It may be removed in a future release (Pm, 2006-01-24)
+if (preg_match("/^$CategoryGroup\\./", $pagename)) {
+  SDV($DefaultPageTextFmt, '');
+  SDV($PageNotFoundHeaderFmt, 'HTTP/1.1 200 Ok');
+}
+
+## [[target | text]]
+Markup('[[|','<[[',
+  "/(?>\\[\\[([^|\\]]*)\\|\\s*)(.*?)\\s*\\]\\]($SuffixPattern)/e",
+  "Keep(MakeLink(\$pagename,PSS('$1'),PSS('$2'),'$3'),'L')");
+
+## [[text -> target ]]
+Markup('[[->','>[[|',
+  "/(?>\\[\\[([^\\]]+?)\\s*-+&gt;\\s*)(.*?)\\]\\]($SuffixPattern)/e",
+  "Keep(MakeLink(\$pagename,PSS('$2'),PSS('$1'),'$3'),'L')");
+
+if (IsEnabled($EnableRelativePageLinks, 1))
+  SDV($QualifyPatterns['/(\\[\\[(?>[^\\]]+?->)?\\s*)([-\\w\\s\'()]+([|#?].*?)?\\]\\])/e'], "PSS('$1').\$group.PSS('/$2')");
+
+## [[#anchor]]
+Markup('[[#','<[[','/(?>\\[\\[#([A-Za-z][-.:\\w]*))\\]\\]/e',
+  "Keep(TrackAnchors('$1') ? '' : \"<a name='$1' id='$1'></a>\", 'L')");
+function TrackAnchors($x) { global $SeenAnchor; return @$SeenAnchor[$x]++; }
+
+## [[target |#]] reference links
+Markup('[[|#', '<[[|',
+  "/(?>\\[\\[([^|\\]]+))\\|\\s*#\\s*\\]\\]/e",  
+  "Keep(MakeLink(\$pagename,PSS('$1'),'['.++\$MarkupFrame[0]['ref'].']'),'L')");
+
+## [[target |+]] title links
+Markup('[[|+', '<[[|',
+  "/(?>\\[\\[([^|\\]]+))\\|\\s*\\+\\s*]]/e",
+  "Keep(MakeLink(\$pagename, PSS('$1'),
+                 PageVar(MakePageName(\$pagename,PSS('$1')), '\$Title')
+                ),'L')");
+
+## bare urllinks 
+Markup('urllink','>[[',
+  "/\\b(?>(\\L))[^\\s$UrlExcludeChars]*[^\\s.,?!$UrlExcludeChars]/e",
+  "Keep(MakeLink(\$pagename,'$0','$0'),'L')");
+
+## mailto: links 
+Markup('mailto','<urllink',
+  "/\\bmailto:([^\\s$UrlExcludeChars]*[^\\s.,?!$UrlExcludeChars])/e",
+  "Keep(MakeLink(\$pagename,'$0','$1'),'L')");
+
+## inline images
+Markup('img','<urllink',
+  "/\\b(?>(\\L))([^\\s$UrlExcludeChars]+$ImgExtPattern)(\"([^\"]*)\")?/e",
+  "Keep(\$GLOBALS['LinkFunctions']['$1'](\$pagename,'$1','$2','$4','$1$2',
+    \$GLOBALS['ImgTagFmt']),'L')");
+
+## bare wikilinks
+##    v2.2: markup rule moved to scripts/wikiwords.php)
+Markup('wikilink', '>urllink');
+
+## escaped `WikiWords 
+##    v2.2: rule kept here for markup compatibility with 2.1 and earlier
+Markup('`wikiword', '<wikilink',
+  "/`(($GroupPattern([\\/.]))?($WikiWordPattern))/e",
+  "Keep('$1')");
+
+#### Block markups ####
+## Completely blank lines don't do anything.
+Markup('blank', '<block', '/^\\s+$/', '');
+
+## process any <:...> markup (after all other block markups)
+Markup('^<:','>block','/^(?=\\s*\\S)(<:([^>]+)>)?/e',"Block('$2')");
+
+## unblocked lines w/block markup become anonymous <:block>
+Markup('^!<:', '<^<:',
+  "/^(?!<:)(?=.*(<\\/?($BlockPattern)\\b)|$KeepToken\\d+B$KeepToken)/",
+  '<:block>');
+
+## Lines that begin with displayed images receive their own block.  A
+## pipe following the image indicates a "caption" (generates a linebreak).
+Markup('^img', 'block',
+  "/^((?>(\\s+|%%|%[A-Za-z][-,=:#\\w\\s'\".]*%)*)$KeepToken(\\d+L)$KeepToken)(\\s*\\|\\s?)?(.*)$/e",
+  "PSS((strpos(\$GLOBALS['KPV']['$3'],'<img')===false) ? '$0' : 
+       '<:block,1><div>$1' . ('$4' ? '<br />' : '') .'$5</div>')");
+
+## Whitespace at the beginning of lines can be used to maintain the
+## indent level of a previous list item, or a preformatted text block.
+Markup('^ws', '<^img', '/^\\s+ #1/ex', "WSIndent('$0')");
+function WSIndent($i) {
+  global $MarkupFrame;
+  $icol = strlen($i);
+  for($depth = count(@$MarkupFrame[0]['cs']); $depth > 0; $depth--)
+    if (@$MarkupFrame[0]['is'][$depth] == $icol) {
+      $MarkupFrame[0]['idep'] = $depth;
+      $MarkupFrame[0]['icol'] = $icol;
+      return '';
+    }
+  return $i;
+}
+
+## The $EnableWSPre setting uses leading spaces on markup lines to indicate
+## blocks of preformatted text.
+SDV($EnableWSPre, 1);
+Markup('^ ', 'block', 
+  '/^\\s+ #2/ex',
+  "(\$GLOBALS['EnableWSPre'] > 0 && strlen('$0') >= \$GLOBALS['EnableWSPre']) 
+     ? '<:pre,1>$0' : '$0'");
+
+## bullet lists
+Markup('^*','block','/^(\\*+)\\s?(\\s*)/','<:ul,$1,$0>$2');
+
+## numbered lists
+Markup('^#','block','/^(#+)\\s?(\\s*)/','<:ol,$1,$0>$2');
+
+## indented (->) /hanging indent (-<) text
+Markup('^->','block','/^(?>(-+))&gt;\\s?(\\s*)/','<:indent,$1,$1  $2>$2');
+Markup('^-<','block','/^(?>(-+))&lt;\\s?(\\s*)/','<:outdent,$1,$1  $2>$2');
+
+## definition lists
+Markup('^::','block','/^(:+)(\s*)([^:]+):/','<:dl,$1,$1$2><dt>$2$3</dt><dd>');
+
+## Q: and A:
+Markup('^Q:', 'block', '/^Q:(.*)$/', "<:block,1><p class='question'>$1</p>");
+Markup('^A:', 'block', '/^A:/', Keep(''));
+
+## tables
+## ||cell||, ||!header cell||, ||!caption!||
+Markup('^||||', 'block', 
+  '/^\\|\\|.*\\|\\|.*$/e',
+  "FormatTableRow(PSS('$0'))");
+## ||table attributes
+Markup('^||','>^||||','/^\\|\\|(.*)$/e',
+  "PZZ(\$GLOBALS['BlockMarkups']['table'][0] = '<table '.PQA(PSS('$1')).'>')
+    .'<:block,1>'");
+
+## headings
+Markup('^!', 'block',
+  '/^(!{1,6})\\s?(.*)$/e',
+  "'<:block,1><h'.strlen('$1').PSS('>$2</h').strlen('$1').'>'");
+
+## horiz rule
+Markup('^----','>^->','/^----+/','<:block,1><hr />');
+
+#### (:table:) markup (AdvancedTables)
+
+function Cells($name,$attr) {
+  global $MarkupFrame;
+  $attr = PQA($attr);
+  $tattr = @$MarkupFrame[0]['tattr'];
+  $name = strtolower($name);
+  $key = preg_replace('/end$/', '', $name);
+  if (strncmp($key, 'cell', 4) == 0) $key = 'cell';
+  $out = '<:block>'.MarkupClose($key);
+  if (substr($name, -3) == 'end') return $out;
+  $cf = & $MarkupFrame[0]['closeall'];
+  if ($name == 'table') $MarkupFrame[0]['tattr'] = $attr; 
+  else if (strncmp($name, 'cell', 4) == 0) {
+    if (strpos($attr, "valign=")===false) $attr .= " valign='top'";
+    if (!@$cf['table']) {
+       $tattr = @$MarkupFrame[0]['tattr'];
+       $out .= "<table $tattr><tr><td $attr>";
+       $cf['table'] = '</td></tr></table>';
+    } else if ($name == 'cellnr') $out .= "</td></tr><tr><td $attr>";
+    else $out .= "</td><td $attr>";
+    $cf['cell'] = '';
+  } else {
+    $out .= "<div $attr>";
+    $cf[$key] = '</div>';
+  }
+  return $out;
+}
+
+Markup('table', '<block',
+  '/^\\(:(table|cell|cellnr|tableend|div\\d*(?:end)?)(\\s.*?)?:\\)/ie',
+  "Cells('$1',PSS('$2'))");
+Markup('^>>', '<table',
+  '/^&gt;&gt;(.+?)&lt;&lt;(.*)$/',
+  '(:div:)%div $1 apply=div%$2 ');
+Markup('^>><<', '<^>>',
+  '/^&gt;&gt;&lt;&lt;/',
+  '(:divend:)');
+
+#### special stuff ####
+## (:markup:) for displaying markup examples
+function MarkupMarkup($pagename, $text, $opt = '') {
+  $MarkupMarkupOpt = array('class' => 'vert');
+  $opt = array_merge($MarkupMarkupOpt, ParseArgs($opt));
+  $html = MarkupToHTML($pagename, $text, array('escape' => 0));
+  if (@$opt['caption']) 
+    $caption = str_replace("'", '&#039;', 
+                           "<caption>{$opt['caption']}</caption>");
+  $class = preg_replace('/[^-\\s\\w]+/', ' ', @$opt['class']);
+  if (strpos($class, 'horiz') !== false) 
+    { $sep = ''; $pretext = wordwrap($text, 40); } 
+  else 
+    { $sep = '</tr><tr>'; $pretext = wordwrap($text, 75); }
+  return Keep(@"<table class='markup $class' align='center'>$caption
+      <tr><td class='markup1' valign='top'><pre>$pretext</pre></td>$sep<td 
+        class='markup2' valign='top'>$html</td></tr></table>");
+}
+
+Markup('markup', '<[=',
+  "/\\(:markup(\\s+([^\n]*?))?:\\)[^\\S\n]*\\[([=@])(.*?)\\3\\]/sei",
+  "MarkupMarkup(\$pagename, PSS('$4'), PSS('$2'))");
+Markup('markupend', '>markup',
+  "/\\(:markup(\\s+([^\n]*?))?:\\)[^\\S\n]*\n(.*?)\\(:markupend:\\)/sei",
+  "MarkupMarkup(\$pagename, PSS('$3'), PSS('$1'))");
+
+SDV($HTMLStylesFmt['markup'], "
+  table.markup { border:2px dotted #ccf; width:90%; }
+  td.markup1, td.markup2 { padding-left:10px; padding-right:10px; }
+  table.vert td.markup1 { border-bottom:1px solid #ccf; }
+  table.horiz td.markup1 { width:23em; border-right:1px solid #ccf; }
+  table.markup caption { text-align:left; }
+  div.faq p, div.faq pre { margin-left:2em; }
+  div.faq p.question { margin:1em 0 0.75em 0; font-weight:bold; }
+  div.faqtoc div.faq * { display:none; }
+  div.faqtoc div.faq p.question 
+    { display:block; font-weight:normal; margin:0.5em 0 0.5em 20px; line-height:normal; }
+  div.faqtoc div.faq p.question * { display:inline; }
+  ");
+
+#### Special conditions ####
+## The code below adds (:if date:) conditions to the markup.
+$Conditions['date'] = "CondDate(\$condparm)";
+
+function CondDate($condparm) {
+  global $Now;
+  if (!preg_match('/^(\\S*?)(\\.\\.(\\S*))?(\\s+\\S.*)?$/',
+                  trim($condparm), $match))
+    return false;
+  if ($match[4] == '') { $x0 = $Now; NoCache(); }
+  else { list($x0, $x1) = DRange($match[4]); }
+  if ($match[1] > '') {
+    list($t0, $t1) = DRange($match[1]);
+    if ($x0 < $t0) return false;
+    if ($match[2] == '' && $x0 >= $t1) return false;
+  }
+  if ($match[3] > '') {
+    list($t0, $t1) = DRange($match[3]);
+    if ($x0 >= $t1) return false;
+  }
+  return true;
+}
+
+# This pattern enables the (:encrypt <phrase>:) markup/replace-on-save
+# pattern.
+SDV($ROSPatterns['/\\(:encrypt\\s+([^\\s:=]+).*?:\\)/e'], "crypt(PSS('$1'))");
+

Added: trunk/oggdsf/website/scripts/trails.php
===================================================================
--- trunk/oggdsf/website/scripts/trails.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/trails.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,126 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2002-2006 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This script enables markup of the form <<|TrailPage|>> to be 
+    used to build "trails" through wiki documents.
+
+    This feature is automatically included from stdconfig.php unless
+    disabled by $EnableWikiTrails = 0; .  To explicitly include this feature,
+    execute
+   	include_once("scripts/trails.php");
+    from config.php somewhere.
+
+    Once enabled, the <<|TrailPage|>> markup is replaced with
+    << PrevPage | TrailPage | NextPage >> on output.  TrailPage should
+    contain either a bullet or number list defining the sequence of pages
+    in the "trail".
+
+    The ^|TrailPage|^ markup uses the depth of the bullets to display
+    the ancestry of the TrailPage to the current one.  The <|TrailPage|> 
+    markup is like <<|TrailPage|>> except that "< PrevPage |" and 
+    "| NextPage >" are omitted if at the beginning or end of the 
+    trail respectively.  Thanks to John Rankin for contributing these
+    markups and the original suggestion for WikiTrails.
+*/
+
+Markup('<<|','<links','/&lt;&lt;\\|([^|]+|\\[\\[(.+?)\\]\\])\\|&gt;&gt;/e',
+  "MakeTrailStop(\$pagename,'$1')");
+Markup('<|','><<|','/&lt;\\|([^|]+|\\[\\[(.+?)\\]\\])\\|&gt;/e',
+  "MakeTrailStopB(\$pagename,'$1')");
+Markup('^|','<links','/\\^\\|([^|]+|\\[\\[(.+?)\\]\\])\\|\\^/e',
+  "MakeTrailPath(\$pagename,'$1')");
+
+SDVA($SaveAttrPatterns, array(
+   '/<<\\|([^|]+|\\[\\[(.+?)\\]\\])\\|>>/' => '$1',
+   '/<\\|([^|]+|\\[\\[(.+?)\\]\\])\\|>/' => '$1',
+   '/\\^\\|([^|]+|\\[\\[(.+?)\\]\\])\\|\\^/' => '$1'));
+
+$Conditions['ontrail'] = 'CondOnTrail($pagename, $condparm)';
+
+function CondOnTrail($pagename, $condparm) {
+  @list($trailname, $pn) = preg_split('/\\s+/', $condparm, 2);
+  $trail = ReadTrail($pagename, $trailname);
+  if (!$trail) return false;
+  $pn = ($pn > '') ? MakePageName($pagename, $pn) : $pagename;
+  foreach($trail as $t)
+    if ($t['pagename'] == $pn) return true;
+  return false;
+}
+
+function ReadTrail($pagename, $trailname) {
+  global $RASPageName, $SuffixPattern, $GroupPattern, $WikiWordPattern,
+    $LinkWikiWords;
+  if (preg_match('/^\\[\\[(.+?)(-&gt;|\\|)(.+?)\\]\\]$/', $trailname, $m)) 
+    $trailname = ($m[2] == '|') ? $m[1] : $m[3];
+  $trailtext = RetrieveAuthSection($pagename, $trailname);
+  $trailname = $RASPageName;
+  $t = array();
+  $n = 0;
+  foreach(explode("\n", htmlspecialchars(@$trailtext, ENT_NOQUOTES)) 
+          as $x) {
+    $x = preg_replace("/\\[\\[([^\\]]*)-&gt;([^\\]]*)\\]\\]/",'[[$2|$1]]',$x);
+    if (!preg_match("/^([#*:]+) \\s* 
+          (\\[\\[([^:#!|][^|:]*?)(\\|.*?)?\\]\\]($SuffixPattern)
+          | (($GroupPattern([\\/.]))?$WikiWordPattern)) (.*)/x",$x,$match))
+       continue;
+    if (@$match[6]) {
+       if (!$LinkWikiWords) continue;
+       $tgt = MakePageName($trailname, $match[6]);
+    } else $tgt = MakePageName($trailname,
+                               preg_replace('/[#?].+/', '', $match[3]));
+    $t[$n]['depth'] = $depth = strlen($match[1]);
+    $t[$n]['pagename'] = $tgt;
+    $t[$n]['markup'] = $match[2];
+    $t[$n]['detail'] = $match[9];
+    for($i=$depth;$i<10;$i++) $d[$i]=$n;
+    if ($depth>1) $t[$n]['parent']=@$d[$depth-1];
+    $n++;
+  }
+  return $t;
+}
+
+function MakeTrailStop($pagename,$trailname) {
+  $t = ReadTrail($pagename,$trailname);
+  $prev=''; $next='';
+  for($i=0;$i<count($t);$i++) {
+    if ($t[$i]['pagename']==$pagename) {
+      if ($i>0) $prev = $t[$i-1]['markup'];
+      if ($i+1<count($t)) $next = $t[$i+1]['markup'];
+    }
+  }
+  return "<span class='wikitrail'>&lt;&lt; $prev | $trailname | $next &gt;&gt;</span>";
+}
+
+function MakeTrailStopB($pagename,$trailname) {
+  $t = ReadTrail($pagename,$trailname);
+  $prev = ''; $next = '';
+  for($i=0;$i<count($t);$i++) {
+    if ($t[$i]['pagename']==$pagename) {
+      if ($i>0) $prev = '&lt; '.$t[$i-1]['markup'].' | ';
+      if ($i+1<count($t)) $next = ' | '.$t[$i+1]['markup'].' &gt;';
+    }
+  }
+  return "<span class='wikitrail'>$prev$trailname$next</span>";
+} 
+
+function MakeTrailPath($pagename,$trailname) {
+  global $TrailPathSep;
+  SDV($TrailPathSep,' | ');
+  $t = ReadTrail($pagename,$trailname);
+  $crumbs = '';
+  for($i=0;$i<count($t);$i++) {
+    if ($t[$i]['pagename']==$pagename) {
+      while (@$t[$i]['depth']>0) {
+        $crumbs = $TrailPathSep.$t[$i]['markup'].$crumbs;
+        $i = @$t[$i]['parent'];
+      }
+      return "<span class='wikitrail'>$trailname$crumbs</span>";
+    }
+  }
+  return $trailname;
+}
+

Added: trunk/oggdsf/website/scripts/transition.php
===================================================================
--- trunk/oggdsf/website/scripts/transition.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/transition.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,261 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2005-2007 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This script handles various "fixup transitions" that might need to 
+    occur to help existing sites smoothly upgrade to newer releases of 
+    PmWiki.  Rather than put the workarounds in the main code files, we 
+    try to centralize them here so we can see what's deprecated and a
+    simple switch (?trans=0 in the url) can tell the admin if his site 
+    is relying on an outdated feature or way of doing things.
+
+    Transitions defined in this script:
+
+      $Transition['wspre']              - leading spaces are pre text
+
+      $Transition['version'] < 2001941  - all transitions listed above
+
+      $Transition['wikiwords']          - 2.1-style WikiWord processing
+
+      $Transition['version'] < 2001924  - all transitions listed above
+
+      $Transition['abslinks']           - absolute links/page vars
+
+      $Transition['version'] < 2001901  - all transitions listed above
+
+      $Transition['vspace']             - restore <p class='vspace'></p>
+
+      $Transition['version'] < 2001006  - all transitions listed above
+
+      $Transition['fplbygroup']         - restore FPLByGroup function
+
+      $Transition['version'] < 2000915  - all transitions listed above
+    
+      $Transition['mainrc']             - keep using Main.AllRecentChanges
+      $Transition['mainapprovedurls']   - keep using Main.ApprovedUrls
+      $Transition['pageeditfmt']        - default $PageEditFmt value
+      $Transition['mainpages']          - other default pages in Main
+
+      $Transition['version'] < 1999944  - all transitions listed above
+
+    To get all of the transitions for compatibility with a previous
+    version of PmWiki, simply set $Transition['version'] in a local
+    configuration file to the version number you want compatibility
+    with.  All of the transitions associated with that version will
+    then be enabled. Example:
+
+            # Keep compatibility with PmWiki version 2.0.13
+            $Transition['version'] = 2000013;
+
+    To explicitly enable or disable specific transitions, set
+    the corresponding $Transition[] element to 1 or 0.  This will 
+    override the $Transition['version'] item listed above.  For 
+    example, to enable just the 'pageeditfmt' transition, use
+
+            $Transition['pageeditfmt'] = 1;
+
+*/
+
+## if ?trans=0 is specified, then we don't do any fixups.
+if (@$_REQUEST['trans']==='0') return;
+
+## Transitions from 2.2.0-beta41
+if (@$Transition['version'] < 2001941)
+  SDVA($Transition, array('wspre' => 1));
+
+if (@$Transition['wspre']) SDV($EnableWSPre, 1);
+
+## Transitions from 2.2.0-beta24
+if (@$Transition['version'] < 2001924)
+  SDVA($Transition, array('wikiwords' => 1));
+
+## wikiwords:
+##   This restores the PmWiki 2.1 behavior for WikiWord processing.
+##   WikiWords aren't linked by default, but appear with
+##   <span class='wikiword'>...</span> tags around them.
+if (@$Transition['wikiwords']) {
+  SDV($EnableWikiWords, 1);
+  SDV($LinkWikiWords, 0);
+}
+
+## Transitions from 2.2.0-beta1
+if (@$Transition['version'] < 2001901) 
+  SDVA($Transition, array('abslinks' => 1));
+
+## abslinks:
+##   This restores settings so that PmWiki treats all links
+##   as absolute (following the 2.1.x and earlier interpretation).
+if (@$Transition['abslinks']) {
+  SDV($EnableRelativePageLinks, 0);
+  SDV($EnableRelativePageVars, 0);
+}
+
+## Transitions from 2.1.12
+
+if (@$Transition['version'] < 2001012) 
+  SDVA($Transition, array('nodivnest' => 1));
+
+## nodivnest:
+##   This restores the PmWiki 2.1.11 behavior that doesn't
+##   allow nesting of divs and tables.
+if (@$Transition['nodivnest']) {
+  function TCells($name,$attr) {
+    global $MarkupFrame;
+    $attr = preg_replace('/([a-zA-Z]=)([^\'"]\\S*)/',"\$1'\$2'",$attr);
+    $tattr = @$MarkupFrame[0]['tattr'];
+    $name = strtolower($name);
+    $out = '<:block>';
+    if (strncmp($name, 'cell', 4) != 0 || @$MarkupFrame[0]['closeall']['div']) {
+      $out .= @$MarkupFrame[0]['closeall']['div'];
+      unset($MarkupFrame[0]['closeall']['div']);
+      $out .= @$MarkupFrame[0]['closeall']['table'];
+      unset($MarkupFrame[0]['closeall']['table']);
+    }
+    if ($name == 'div') {
+      $MarkupFrame[0]['closeall']['div'] = "</div>";
+      $out .= "<div $attr>";
+    }
+    if ($name == 'table') $MarkupFrame[0]['tattr'] = $attr;
+    if (strncmp($name, 'cell', 4) == 0) {
+      if (strpos($attr, "valign=")===false) $attr .= " valign='top'";
+      if (!@$MarkupFrame[0]['closeall']['table']) {
+        $MarkupFrame[0]['closeall']['table'] = "</td></tr></table>";
+        $out .= "<table $tattr><tr><td $attr>";
+      } else if ($name == 'cellnr') $out .= "</td></tr><tr><td $attr>";
+      else $out .= "</td><td $attr>";
+    }
+    return $out;
+  }
+
+  Markup('table', '<block',
+    '/^\\(:(table|cell|cellnr|tableend|div|divend)(\\s.*?)?:\\)/ie',
+    "TCells('$1',PSS('$2'))");
+}
+
+
+## Transitions from 2.1.7
+
+if (@$Transition['version'] < 2001007)
+  SDVA($Transition, array('vspace' => 1));
+
+## vspace:
+##   This restores PmWiki's use of <p class='vspace'></p> to mark
+##   vertical space in the output.
+if (@$Transition['vspace']) $HTMLVSpace = "<p class='vspace'></p>";
+
+
+## Transitions from 2.1.beta15
+
+if (@$Transition['version'] < 2000915) 
+  SDVA($Transition, array('fplbygroup' => 1));
+
+## fplbygroup:
+##   The FPLByGroup function was removed in 2.1.beta15, this restores it.
+if (@$Transition['fplbygroup'] && !function_exists('FPLByGroup')) {
+  SDV($FPLFormatOpt['bygroup'], array('fn' => 'FPLByGroup'));
+  function FPLByGroup($pagename, &$matches, $opt) {
+    global $FPLByGroupStartFmt, $FPLByGroupEndFmt, $FPLByGroupGFmt,
+      $FPLByGroupIFmt, $FPLByGroupOpt;
+    SDV($FPLByGroupStartFmt,"<dl class='fplbygroup'>");
+    SDV($FPLByGroupEndFmt,'</dl>');
+    SDV($FPLByGroupGFmt,"<dt><a href='\$ScriptUrl/\$Group'>\$Group</a> /</dt>\n");
+    SDV($FPLByGroupIFmt,"<dd><a href='\$PageUrl'>\$Name</a></dd>\n");
+    SDVA($FPLByGroupOpt, array('readf' => 0, 'order' => 'name'));
+    $matches = MakePageList($pagename, 
+                            array_merge((array)$FPLByGroupOpt, $opt), 0);
+    if (@$opt['count']) array_splice($matches, $opt['count']);
+    if (count($matches)<1) return '';
+    $out = '';
+    foreach($matches as $pn) {
+      $pgroup = FmtPageName($FPLByGroupGFmt, $pn);
+      if ($pgroup != @$lgroup) { $out .= $pgroup; $lgroup = $pgroup; }
+      $out .= FmtPageName($FPLByGroupIFmt, $pn);
+    }
+    return FmtPageName($FPLByGroupStartFmt, $pagename) . $out .
+           FmtPageName($FPLByGroupEndFmt, $pagename);
+  }
+}
+
+## Transitions from 2.0.beta44
+
+if (@$Transition['version'] < 1999944) 
+  SDVA($Transition, array('mainrc' => 1, 'mainapprovedurls' => 1,
+    'pageeditfmt' => 1, 'mainpages' => 1));
+
+## mainrc:
+##   2.0.beta44 switched Main.AllRecentChanges to be 
+##   $SiteGroup.AllRecentChanges.  This setting keeps Main.AllRecentChanges
+##   if it exists.
+if (@$Transition['mainrc'] && PageExists('Main.AllRecentChanges')) {
+  SDV($RecentChangesFmt['Main.AllRecentChanges'],
+    '* [[$Group.$Name]]  . . . $CurrentTime $[by] $AuthorLink');
+}
+
+## siteapprovedurls:
+##   2.0.beta44 switched Main.ApprovedUrls to be $SiteGroup.ApprovedUrls .
+##   This setting keeps using Main.ApprovedUrls if it exists.
+if (@$Transition['mainapprovedurls'] && PageExists('Main.ApprovedUrls')) {
+  $ApprovedUrlPagesFmt = (array)$ApprovedUrlPagesFmt;
+  if (PageExists(FmtPageName($ApprovedUrlPagesFmt[0], $pagename))) 
+    $ApprovedUrlPagesFmt[] = 'Main.ApprovedUrls';
+  else array_unshift($ApprovedUrlPagesFmt, 'Main.ApprovedUrls');
+}
+
+## pageeditfmt:
+##   2.0.beta44 switched to using wiki markup forms for page editing.
+##   However, some sites and skins have customized values of $PageEdit.
+##   This setting restores the default values.
+if (@$Transition['pageeditfmt']) {
+  SDV($PageEditFmt, "<div id='wikiedit'>
+    <a id='top' name='top'></a>
+    <h1 class='wikiaction'>$[Editing \$FullName]</h1>
+    <form method='post' action='\$PageUrl?action=edit'>
+    <input type='hidden' name='action' value='edit' />
+    <input type='hidden' name='n' value='\$FullName' />
+    <input type='hidden' name='basetime' value='\$EditBaseTime' />
+    \$EditMessageFmt
+    <textarea id='text' name='text' rows='25' cols='60'
+      onkeydown='if (event.keyCode==27) event.returnValue=false;'
+      >\$EditText</textarea><br />
+    $[Author]: <input type='text' name='author' value='\$Author' />
+    <input type='checkbox' name='diffclass' value='minor' \$DiffClassMinor />
+      $[This is a minor edit]<br />
+    <input type='submit' name='post' value=' $[Save] ' />
+    <input type='submit' name='preview' value=' $[Preview] ' />
+    <input type='reset' value=' $[Reset] ' /></form></div>");
+  if (@$_POST['preview']) 
+    SDV($PagePreviewFmt, "<div id='wikipreview'>
+      <h2 class='wikiaction'>$[Preview \$FullName]</h2>
+      <p><b>$[Page is unsaved]</b></p>
+      \$PreviewText
+      <hr /><p><b>$[End of preview -- remember to save]</b><br />
+      <a href='#top'>$[Top]</a></p></div>");
+  SDV($HandleEditFmt, array(&$PageStartFmt,
+    &$PageEditFmt, 'wiki:$[PmWiki.EditQuickReference]', &$PagePreviewFmt,
+    &$PageEndFmt));
+  $EditMessageFmt = implode('', $MessagesFmt) . $EditMessageFmt;
+  if ($action=='edit' && IsEnabled($EnableGUIButtons, 0)) 
+    array_push($EditFunctions, 'GUIEdit');
+} else $MessagesFmt[] = @$EditMessageFmt;
+
+    
+function GUIEdit($pagename, &$page, &$new) {
+  global $EditMessageFmt;
+  $EditMessageFmt .= GUIButtonCode($pagename);
+}
+
+## mainpages:
+##   In 2.0.beta44 several utility pages change location to the new Site
+##   group.  These settings cause some skins (that use translations)
+##   to know to link to the new locations.
+if ($Transition['mainpages']) {
+  XLSDV('en', array(
+    'Main/SearchWiki' => XL('Site/Search'),
+    'PmWiki.EditQuickReference' => XL('Site/EditQuickReference'),
+    'PmWiki.UploadQuickReference' => XL('Site/UploadQuickReference'),
+    ));
+}
+

Added: trunk/oggdsf/website/scripts/upgrades.php
===================================================================
--- trunk/oggdsf/website/scripts/upgrades.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/upgrades.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,98 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2007 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+*/
+
+$HandleActions['upgrade'] = 'HandleUpgrade';
+$HandleAuth['upgrade'] = 'read';
+
+function HandleUpgrade($pagename, $auth = 'ALWAYS') {
+  global $SiteGroup, $SiteAdminGroup, $StatusPageName, $ScriptUrl,
+    $AuthUserPageFmt, $VersionNum, $Version;
+  StopWatch('HandleUpgrade: begin');
+
+  $message = '';
+  $done = '';
+  ##  check for Site.* --> SiteAdmin.*
+  foreach(array('AuthUser', 'NotifyList', 'Blocklist', 'ApprovedUrls') as $n) {
+    $n0 = "$SiteGroup.$n"; $n1 = "$SiteAdminGroup.$n";
+    StopWatch("HandleUpgrade: checking $n0 -> $n1");
+    ## checking AuthUser is special, because Site.AuthUser comes with the
+    ## distribution.
+    if ($n == 'AuthUser') {
+      ##  if we already have a user-modified SiteAdmin.AuthUser, we can skip
+      SDV($AuthUserPageFmt, '$SiteAdminGroup.AuthUser');
+      $n1 = FmtPageName($AuthUserPageFmt, $pagename);
+      $page = ReadPage($n1, READPAGE_CURRENT);
+      if (@$page['time'] > 1000000000) continue;
+      ##  if there's not a user-modified Site.AuthUser, we can skip
+      $page = ReadPage($n0, READPAGE_CURRENT);
+      if (@$page['time'] == 1000000000) continue;
+    } else if (!PageExists($n0) || PageExists($n1)) continue;
+
+    if (@$_REQUEST['migrate'] == 'yes') {
+      ##  if the admin wants PmWiki to migrate, do it.
+      $page = RetrieveAuthPage($n0, 'admin', true);
+      StopWatch("HandleUpgrade: copying $n0 -> $n1");
+      if ($page) { 
+        WritePage($n1, $page); 
+        $done .= "<li>Copied $n0 to $n1</li>";
+        continue; 
+      }
+    }
+    $message .= "<li>$n0 -&gt; $n1</li>";
+  }
+
+  if ($message) {
+    $migrateurl = "$ScriptUrl?action=upgrade&amp;migrate=yes";
+    $infourl = 'http://www.pmwiki.org/wiki/PmWiki/UpgradeToSiteAdmin';
+    $message = 
+      "<h2>Upgrade notice -- SiteAdmin group</h2>
+      <p>This version of PmWiki expects several administrative pages 
+      from the <em>Site</em> group to be found in a new <em>SiteAdmin</em> group.  
+      On this site, the following pages appear to need to be relocated:</p>
+      <ul>$message</ul>
+
+      <p>For more information about this change, including the various
+      options for proceeding, see</p>
+      <blockquote><a target='_blank' href='$infourl'>$infourl</a></blockquote>
+
+      <form action='$ScriptUrl' method='post'>
+      <p>If you would like PmWiki to attempt to automatically copy 
+      these pages into their new <br /> locations for you, try 
+        <input type='hidden' name='action' value='upgrade' />
+        <input type='hidden' name='migrate' value='yes' />
+        <input type='submit' value='Relocate pages listed above' /> 
+        (admin password required) </p>
+      </form>
+
+      <p>If you want to configure PmWiki so that it continues to
+      look for the above pages in <em>$SiteGroup</em>, add the
+      following line near the top of <em>local/config.php</em>:</p>
+
+      <blockquote><pre>\$SiteAdminGroup = \$SiteGroup;</pre></blockquote>
+
+      $Version
+      ";
+    print $message;
+    exit;
+  }
+
+  StopWatch("UpgradeCheck: writing $StatusPageName");
+  Lock(2);
+  SDV($StatusPageName, "$SiteAdminGroup.Status");
+  $page = ReadPage($StatusPageName);
+  $page['updatedto'] = $VersionNum;
+  WritePage($StatusPageName, $page);
+
+  if ($done) {
+    $done .= "<li>Updated $StatusPageName</li>";
+    echo "<h2>Upgrade to $Version ... ok</h2><ul>$done</ul>";
+    $GLOBALS['EnableRedirect'] = 0;
+  }
+  Redirect($pagename);
+}

Added: trunk/oggdsf/website/scripts/upload.php
===================================================================
--- trunk/oggdsf/website/scripts/upload.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/upload.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,311 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2004-2007 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This script adds upload capabilities to PmWiki.  Uploads can be
+    enabled by setting
+        $EnableUpload = 1;
+    in config.php.  In addition, an upload password must be set, as
+    the default is to lock uploads.  In some configurations it may also
+    be necessary to set values for $UploadDir and $UploadUrlFmt,
+    especially if any form of URL rewriting is being performed.
+    See the PmWiki.UploadsAdmin page for more information.
+*/
+
+## $EnableUploadOverwrite determines if we allow previously uploaded
+## files to be overwritten.
+SDV($EnableUploadOverwrite,1);
+
+## $UploadExts contains the list of file extensions we're willing to
+## accept, along with the Content-Type: value appropriate for each.
+SDVA($UploadExts,array(
+  'gif' => 'image/gif', 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg',
+  'png' => 'image/png', 'bmp' => 'image/bmp', 'ico' => 'image/x-icon',
+  'wbmp' => 'image/vnd.wap.wbmp',
+  'mp3' => 'audio/mpeg', 'au' => 'audio/basic', 'wav' => 'audio/x-wav',
+  'mpg' => 'video/mpeg', 'mpeg' => 'video/mpeg',
+  'mov' => 'video/quicktime', 'qt' => 'video/quicktime',
+  'wmf' => 'text/plain', 'avi' => 'video/x-msvideo',
+  'zip' => 'application/zip', 
+  'gz' => 'application/x-gzip', 'tgz' => 'application/x-gzip',
+  'rpm' => 'application/x-rpm', 
+  'hqx' => 'application/mac-binhex40', 'sit' => 'application/x-stuffit',
+  'doc' => 'application/msword', 'ppt' => 'application/vnd.ms-powerpoint',
+  'xls' => 'application/vnd.ms-excel', 'mdb' => 'text/plain',
+  'exe' => 'application/octet-stream',
+  'pdf' => 'application/pdf', 'psd' => 'text/plain', 
+  'ps' => 'application/postscript', 'ai' => 'application/postscript',
+  'eps' => 'application/postscript',
+  'htm' => 'text/html', 'html' => 'text/html', 'css' => 'text/css', 
+  'fla' => 'application/x-shockwave-flash', 
+  'swf' => 'application/x-shockwave-flash',
+  'txt' => 'text/plain', 'rtf' => 'application/rtf', 
+  'tex' => 'application/x-tex', 'dvi' => 'application/x-dvi',
+  'odt' => 'application/vnd.oasis.opendocument.text',
+  'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
+  'odp' => 'application/vnd.oasis.opendocument.presentation',
+  'kml' => 'application/vnd.google-earth.kml+xml',
+  'kmz' => 'application/vnd.google-earth.kmz',
+  '' => 'text/plain'));
+
+SDV($UploadMaxSize,1500000);
+SDV($UploadPrefixQuota,0);
+SDV($UploadDirQuota,0);
+foreach($UploadExts as $k=>$v) 
+  if (!isset($UploadExtSize[$k])) $UploadExtSize[$k]=$UploadMaxSize;
+
+SDV($UploadDir,'uploads');
+SDV($UploadPrefixFmt,'/$Group');
+SDV($UploadFileFmt,"$UploadDir$UploadPrefixFmt");
+$v = preg_replace('#^/(.*/)#', '', $UploadDir);
+SDV($UploadUrlFmt,preg_replace('#/[^/]*$#', "/$v", $PubDirUrl, 1));
+SDV($LinkUploadCreateFmt, "<a rel='nofollow' class='createlinktext' href='\$LinkUpload'>\$LinkText</a><a rel='nofollow' class='createlink' href='\$LinkUpload'>&nbsp;&Delta;</a>");
+
+SDV($PageUploadFmt,array("
+  <div id='wikiupload'>
+  <h2 class='wikiaction'>$[Attachments for] {\$FullName}</h2>
+  <h3>\$UploadResult</h3>
+  <form enctype='multipart/form-data' action='{\$PageUrl}' method='post'>
+  <input type='hidden' name='n' value='{\$FullName}' />
+  <input type='hidden' name='action' value='postupload' />
+  <table border='0'>
+    <tr><td align='right'>$[File to upload:]</td><td><input
+      name='uploadfile' type='file' /></td></tr>
+    <tr><td align='right'>$[Name attachment as:]</td>
+      <td><input type='text' name='upname' value='\$UploadName' /><input 
+        type='submit' value=' $[Upload] ' /><br />
+        </td></tr></table></form></div>",
+  'wiki:$[{$SiteGroup}/UploadQuickReference]'));
+XLSDV('en',array(
+  'ULsuccess' => 'successfully uploaded',
+  'ULbadname' => 'invalid attachment name',
+  'ULbadtype' => '\'$upext\' is not an allowed file extension',
+  'ULtoobig' => 'file is larger than maximum allowed by webserver',
+  'ULtoobigext' => 'file is larger than allowed maximum of $upmax
+     bytes for \'$upext\' files',
+  'ULpartial' => 'incomplete file received',
+  'ULnofile' => 'no file uploaded',
+  'ULexists' => 'file with that name already exists',
+  'ULpquota' => 'group quota exceeded',
+  'ULtquota' => 'upload quota exceeded'));
+SDV($PageAttributes['passwdupload'],'$[Set new upload password:]');
+SDV($DefaultPasswords['upload'],'*');
+SDV($AuthCascade['upload'], 'read');
+SDV($FmtPV['$PasswdUpload'], 'PasswdVar($pn, "upload")');
+
+Markup('attachlist', 'directives', 
+  '/\\(:attachlist\\s*(.*?):\\)/ei',
+  "Keep('<ul>'.FmtUploadList('$pagename',PSS('$1')).'</ul>')");
+SDV($GUIButtons['attach'], array(220, 'Attach:', '', '$[file.ext]',
+  '$GUIButtonDirUrlFmt/attach.gif"$[Attach file]"'));
+SDV($LinkFunctions['Attach:'], 'LinkUpload');
+SDV($IMap['Attach:'], '$1');
+SDVA($HandleActions, array('upload' => 'HandleUpload',
+  'postupload' => 'HandlePostUpload',
+  'download' => 'HandleDownload'));
+SDVA($HandleAuth, array('upload' => 'upload',
+  'download' => 'read'));
+SDV($HandleAuth['postupload'], $HandleAuth['upload']);
+SDV($UploadVerifyFunction, 'UploadVerifyBasic');
+
+function MakeUploadName($pagename,$x) {
+  global $UploadNameChars;
+  SDV($UploadNameChars, "-\\w. ");
+  $x = preg_replace("/[^$UploadNameChars]/", '', $x);
+  $x = preg_replace('/\\.[^.]*$/e', "strtolower('$0')", $x);
+  $x = preg_replace('/^[^[:alnum:]_]+/', '', $x);
+  return preg_replace('/[^[:alnum:]_]+$/', '', $x);
+}
+
+function LinkUpload($pagename, $imap, $path, $alt, $txt, $fmt=NULL) {
+  global $FmtV, $UploadFileFmt, $LinkUploadCreateFmt, $UploadUrlFmt,
+    $UploadPrefixFmt, $EnableDirectDownload;
+  if (preg_match('!^(.*)/([^/]+)$!', $path, $match)) {
+    $pagename = MakePageName($pagename, $match[1]);
+    $path = $match[2];
+  }
+  $upname = MakeUploadName($pagename, $path);
+  $filepath = FmtPageName("$UploadFileFmt/$upname", $pagename);
+  $FmtV['$LinkUpload'] = 
+    FmtPageName("\$PageUrl?action=upload&amp;upname=$upname", $pagename);
+  $FmtV['$LinkText'] = $txt;
+  if (!file_exists($filepath)) 
+    return FmtPageName($LinkUploadCreateFmt, $pagename);
+  $path = PUE(FmtPageName(IsEnabled($EnableDirectDownload, 1) 
+                            ? "$UploadUrlFmt$UploadPrefixFmt/$upname"
+                            : "{\$PageUrl}?action=download&amp;upname=$upname",
+                          $pagename));
+  return LinkIMap($pagename, $imap, $path, $alt, $txt, $fmt);
+}
+
+function HandleUpload($pagename, $auth = 'upload') {
+  global $FmtV,$UploadExtMax,
+    $HandleUploadFmt,$PageStartFmt,$PageEndFmt,$PageUploadFmt;
+  $page = RetrieveAuthPage($pagename, $auth, true, READPAGE_CURRENT);
+  if (!$page) Abort("?cannot upload to $pagename");
+  PCache($pagename,$page);
+  $FmtV['$UploadName'] = MakeUploadName($pagename,@$_REQUEST['upname']);
+  $upresult = htmlspecialchars(@$_REQUEST['upresult']);
+  $uprname = htmlspecialchars(@$_REQUEST['uprname']);
+  $FmtV['$upext'] = htmlspecialchars(@$_REQUEST['upext']);
+  $FmtV['$upmax'] = htmlspecialchars(@$_REQUEST['upmax']);
+  $FmtV['$UploadResult'] = ($upresult) ?
+    FmtPageName("<i>$uprname</i>: $[UL$upresult]",$pagename) : '';
+  SDV($HandleUploadFmt,array(&$PageStartFmt,&$PageUploadFmt,&$PageEndFmt));
+  PrintFmt($pagename,$HandleUploadFmt);
+}
+
+function HandleDownload($pagename, $auth = 'read') {
+  global $UploadFileFmt, $UploadExts, $DownloadDisposition;
+  SDV($DownloadDisposition, "inline");
+  $page = RetrieveAuthPage($pagename, $auth, true, READPAGE_CURRENT);
+  if (!$page) Abort("?cannot read $pagename");
+  $upname = MakeUploadName($pagename, @$_REQUEST['upname']);
+  $filepath = FmtPageName("$UploadFileFmt/$upname", $pagename);
+  if (!$upname || !file_exists($filepath)) {
+    header("HTTP/1.0 404 Not Found");
+    Abort("?requested file not found");
+    exit();
+  }
+  preg_match('/\\.([^.]+)$/',$filepath,$match); 
+  if ($UploadExts[@$match[1]]) 
+    header("Content-Type: {$UploadExts[@$match[1]]}");
+  header("Content-Length: ".filesize($filepath));
+  header("Content-disposition: $DownloadDisposition; filename=$upname");
+  $fp = fopen($filepath, "r");
+  if ($fp) {
+    while (!feof($fp)) echo fread($fp, 4096);
+    fclose($fp);
+  }
+  exit();
+}  
+ 
+function HandlePostUpload($pagename, $auth = 'upload') {
+  global $UploadVerifyFunction, $UploadFileFmt, $LastModFile, 
+    $EnableUploadVersions, $Now;
+  $page = RetrieveAuthPage($pagename, $auth, true, READPAGE_CURRENT);
+  if (!$page) Abort("?cannot upload to $pagename");
+  $uploadfile = $_FILES['uploadfile'];
+  $upname = $_REQUEST['upname'];
+  if ($upname=='') $upname=$uploadfile['name'];
+  $upname = MakeUploadName($pagename,$upname);
+  if (!function_exists($UploadVerifyFunction))
+    Abort('?no UploadVerifyFunction available');
+  $filepath = FmtPageName("$UploadFileFmt/$upname",$pagename);
+  $result = $UploadVerifyFunction($pagename,$uploadfile,$filepath);
+  if ($result=='') {
+    $filedir = preg_replace('#/[^/]*$#','',$filepath);
+    mkdirp($filedir);
+    if (IsEnabled($EnableUploadVersions, 0))
+      @rename($filepath, "$filepath,$Now");
+    if (!move_uploaded_file($uploadfile['tmp_name'],$filepath))
+      { Abort("?cannot move uploaded file to $filepath"); return; }
+    fixperms($filepath,0444);
+    if ($LastModFile) { touch($LastModFile); fixperms($LastModFile); }
+    $result = "upresult=success";
+  }
+  Redirect($pagename,"{\$PageUrl}?action=upload&uprname=$upname&$result");
+}
+
+function UploadVerifyBasic($pagename,$uploadfile,$filepath) {
+  global $EnableUploadOverwrite,$UploadExtSize,$UploadPrefixQuota,
+    $UploadDirQuota,$UploadDir;
+  if (!$EnableUploadOverwrite && file_exists($filepath)) 
+    return 'upresult=exists';
+  preg_match('/\\.([^.\\/]+)$/',$filepath,$match); $ext=@$match[1];
+  $maxsize = $UploadExtSize[$ext];
+  if ($maxsize<=0) return "upresult=badtype&upext=$ext";
+  if ($uploadfile['size']>$maxsize) 
+    return "upresult=toobigext&upext=$ext&upmax=$maxsize";
+  switch (@$uploadfile['error']) {
+    case 1: return 'upresult=toobig';
+    case 2: return 'upresult=toobig';
+    case 3: return 'upresult=partial';
+    case 4: return 'upresult=nofile';
+  }
+  if (!is_uploaded_file($uploadfile['tmp_name'])) return 'upresult=nofile';
+  $filedir = preg_replace('#/[^/]*$#','',$filepath);
+  if ($UploadPrefixQuota && 
+      (dirsize($filedir)- at filesize($filepath)+$uploadfile['size']) >
+        $UploadPrefixQuota) return 'upresult=pquota';
+  if ($UploadDirQuota && 
+      (dirsize($UploadDir)- at filesize($filepath)+$uploadfile['size']) >
+        $UploadDirQuota) return 'upresult=tquota';
+  return '';
+}
+
+function dirsize($dir) {
+  $size = 0;
+  $dirp = @opendir($dir);
+  if (!$dirp) return 0;
+  while (($file=readdir($dirp)) !== false) {
+    if ($file[0]=='.') continue;
+    if (is_dir("$dir/$file")) $size+=dirsize("$dir/$file");
+    else $size+=filesize("$dir/$file");
+  }
+  closedir($dirp);
+  return $size;
+}
+
+function FmtUploadList($pagename, $args) {
+  global $UploadDir, $UploadPrefixFmt, $UploadUrlFmt, $EnableUploadOverwrite,
+    $TimeFmt, $EnableDirectDownload;
+
+  $opt = ParseArgs($args);
+  if (@$opt[''][0]) $pagename = MakePageName($pagename, $opt[''][0]);
+  if (@$opt['ext']) 
+    $matchext = '/\\.(' 
+      . implode('|', preg_split('/\\W+/', $opt['ext'], -1, PREG_SPLIT_NO_EMPTY))
+      . ')$/i';
+
+  $uploaddir = FmtPageName("$UploadDir$UploadPrefixFmt", $pagename);
+  $uploadurl = FmtPageName(IsEnabled($EnableDirectDownload, 1) 
+                          ? "$UploadUrlFmt$UploadPrefixFmt/"
+                          : "\$PageUrl?action=download&amp;upname=",
+                      $pagename);
+
+  $dirp = @opendir($uploaddir);
+  if (!$dirp) return '';
+  $filelist = array();
+  while (($file=readdir($dirp)) !== false) {
+    if ($file{0} == '.') continue;
+    if (@$matchext && !preg_match(@$matchext, $file)) continue;
+    $filelist[$file] = $file;
+  }
+  closedir($dirp);
+  $out = array();
+  natcasesort($filelist);
+  $overwrite = '';
+  foreach($filelist as $file=>$x) {
+    $name = PUE("$uploadurl$file");
+    $stat = stat("$uploaddir/$file");
+    if ($EnableUploadOverwrite) 
+      $overwrite = FmtPageName("<a rel='nofollow' class='createlink'
+        href='\$PageUrl?action=upload&amp;upname=$file'>&nbsp;&Delta;</a>", 
+        $pagename);
+    $out[] = "<li> <a href='$name'>$file</a>$overwrite ... ".
+      number_format($stat['size']) . " bytes ... " . 
+      strftime($TimeFmt, $stat['mtime']) . "</li>";
+  }
+  return implode("\n",$out);
+}
+
+# this adds (:if [!]attachments:) to the markup
+$Conditions['attachments'] = "AttachExist(\$pagename)";
+function AttachExist($pagename) {
+  global $UploadDir, $UploadPrefixFmt;
+  $uploaddir = FmtPageName("$UploadDir$UploadPrefixFmt", $pagename);
+  $count = 0;
+  $dirp = @opendir($uploaddir);
+  if ($dirp) {
+    while (($file = readdir($dirp)) !== false) 
+      if ($file{0} != '.') $count++;
+    closedir($dirp);
+  }
+  return $count;
+}
+
+

Added: trunk/oggdsf/website/scripts/urlapprove.php
===================================================================
--- trunk/oggdsf/website/scripts/urlapprove.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/urlapprove.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,125 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2004-2006 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This script provides a URL-approval capability.  To enable this
+    script, add the following line to a configuration file:
+
+        include_once('scripts/urlapprove.php');
+
+    The URL prefixes to be allowed are stored as patterns in 
+    $WhiteUrlPatterns.  This array can be loaded from config.php, or 
+    from the wiki pages given by the $ApprovedUrlPagesFmt[] array.  
+    Any http: or https: URL that isn't in $WhiteUrlPatterns is rendered 
+    using $UnapprovedLinkFmt.
+
+    The script also provides ?action=approveurls and ?action=approvesites, 
+    which scan the current page for any new URLs to be automatically added
+    the first page of $UrlApprovalPagesFmt.
+
+    Finally, the script will block any post containing more than
+    $UnapprovedLinkCountMax unapproved urls in it.  By default this
+    is set to a very large number, leaving the posting of unapproved
+    urls wide open, but by setting $UnapprovedLinkCountMax to a smaller
+    number you can limit the number of unapproved urls that make it into
+    a page.  (Wikispammers seem to like to post long lists of urls, while
+    more "normal" authors tend to only post a few.)
+*/
+
+$LinkFunctions['http:'] = 'LinkHTTP';
+$LinkFunctions['https:'] = 'LinkHTTP';
+SDV($ApprovedUrlPagesFmt, array('$SiteAdminGroup.ApprovedUrls'));
+SDV($UnapprovedLinkFmt,
+  "\$LinkText<a class='apprlink' href='{\$PageUrl}?action=approvesites'>$[(approve sites)]</a>");
+$HTMLStylesFmt['urlapprove'] = '.apprlink { font-size:smaller; }';
+SDV($ApproveUrlPattern,
+  "\\bhttps?:[^\\s$UrlExcludeChars]*[^\\s.,?!$UrlExcludeChars]");
+$WhiteUrlPatterns = (array)$WhiteUrlPatterns;
+SDV($HandleActions['approveurls'], 'HandleApprove');
+SDV($HandleAuth['approveurls'], 'edit');
+SDV($HandleActions['approvesites'], 'HandleApprove');
+SDV($HandleAuth['approvesites'], 'edit');
+SDV($UnapprovedLinkCountMax, 1000000);
+array_splice($EditFunctions, array_search('PostPage', $EditFunctions),
+  0, 'BlockUnapprovedPosts');
+
+function LinkHTTP($pagename,$imap,$path,$alt,$txt,$fmt=NULL) {
+  global $EnableUrlApprovalRequired, $IMap, $WhiteUrlPatterns, $FmtV,
+    $UnapprovedLink, $UnapprovedLinkCount, $UnapprovedLinkFmt;
+  if (!IsEnabled($EnableUrlApprovalRequired,1))
+    return LinkIMap($pagename,$imap,$path,$alt,$txt,$fmt);
+  static $havereadpages;
+  if (!$havereadpages) { ReadApprovedUrls($pagename); $havereadpages=true; }
+  $p = str_replace(' ','%20',$path);
+  $url = str_replace('$1',$p,$IMap[$imap]);
+  if (!isset($UnapprovedLink)) $UnapprovedLink = array();
+  foreach((array)$WhiteUrlPatterns as $pat) {
+    if (preg_match("!^$pat(/|$)!i",$url))
+      return LinkIMap($pagename,$imap,$path,$alt,$txt,$fmt);
+  }
+  $FmtV['$LinkUrl'] = PUE(str_replace('$1',$path,$IMap[$imap]));
+  $FmtV['$LinkText'] = $txt;
+  $FmtV['$LinkAlt'] = str_replace(array('"',"'"),array('&#34;','&#39;'),$alt);
+  $UnapprovedLink[] = $url;
+  @$UnapprovedLinkCount++;
+  return FmtPageName($UnapprovedLinkFmt,$pagename);
+}
+
+function ReadApprovedUrls($pagename) {
+  global $ApprovedUrlPagesFmt,$ApproveUrlPattern,$WhiteUrlPatterns;
+  foreach((array)$ApprovedUrlPagesFmt as $p) {
+    $pn = FmtPageName($p, $pagename);
+    StopWatch("ReadApprovedUrls $pn begin");
+    $apage = ReadPage($pn, READPAGE_CURRENT);
+    preg_match_all("/$ApproveUrlPattern/",@$apage['text'],$match);
+    foreach($match[0] as $a) 
+      $WhiteUrlPatterns[] = preg_quote($a,'!');
+    StopWatch("ReadApprovedUrls $pn end");
+  }
+}
+
+function HandleApprove($pagename, $auth='edit') {
+  global $ApproveUrlPattern,$WhiteUrlPatterns,$ApprovedUrlPagesFmt,$action;
+  Lock(2);
+  $page = ReadPage($pagename);
+  $text = preg_replace('/[()]/','',$page['text']);
+  preg_match_all("/$ApproveUrlPattern/",$text,$match);
+  ReadApprovedUrls($pagename);
+  $addpat = array();
+  foreach($match[0] as $a) {
+    if ($action=='approvesites') 
+      $a=preg_replace("!^([^:]+://[^/]+).*$!",'$1',$a);
+    $addpat[] = $a;
+  }
+  if (count($addpat)>0) {
+    $aname = FmtPageName($ApprovedUrlPagesFmt[0],$pagename);
+    $apage = RetrieveAuthPage($aname, $auth);
+    if (!$apage) Abort("?cannot edit $aname");
+    $new = $apage;
+    if (substr($new['text'],-1,1)!="\n") $new['text'].="\n";
+    foreach($addpat as $a) {
+      foreach((array)$WhiteUrlPatterns as $pat)
+        if (preg_match("!^$pat(/|$)!i",$a)) continue 2;
+      $urlp = preg_quote($a,'!');
+      $WhiteUrlPatterns[] = $urlp;
+      $new['text'].="  $a\n";
+    }
+    $_POST['post'] = 'y';
+    PostPage($aname,$apage,$new);
+  }
+  Redirect($pagename);
+}
+
+function BlockUnapprovedPosts($pagename, &$page, &$new) {
+  global $EnableUrlApprovalRequired, $UnapprovedLinkCount, 
+    $UnapprovedLinkCountMax, $EnablePost, $MessagesFmt, $BlockMessageFmt;
+  if (!IsEnabled($EnableUrlApprovalRequired, 1)) return;
+  if ($UnapprovedLinkCount <= $UnapprovedLinkCountMax) return;
+  if ($page['=auth']['admin']) return;
+  $EnablePost = 0;
+  $MessagesFmt[] = $BlockMessageFmt;
+}
+    

Added: trunk/oggdsf/website/scripts/vardoc.php
===================================================================
--- trunk/oggdsf/website/scripts/vardoc.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/vardoc.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,78 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2002-2005 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This script provides special handling for WikiWords that are
+    preceded by a $, treating them as PmWiki variables to be looked up
+    in the variable documentation pages if such documentation exists.
+    The $VarPagesFmt variable contains a list of pages to be searched
+    to build an index of the variable documentation.  This index is 
+    generated only once per browse request, and then only when needed.
+*/
+
+SDV($VarPagesFmt,array('$[PmWiki.Variables]'));
+Markup('varlink','<wikilink',"/\\$($WikiWordPattern)\\b/e",
+  "Keep(VarLink(\$pagename,'$1','$$1'))");
+Markup('vardef','<links',"/^:\\$($WikiWordPattern):/",
+  ':[[#$1]]$$1:');
+Markup('varindex', 'directives',
+  '/\\(:varindex:\\)/ei',
+  "Keep(VarIndexList(\$pagename))");
+
+$HTMLStylesFmt['vardoc'] = "a.varlink { text-decoration:none; }\n";
+
+function VarLink($pagename,$tgt,$txt) {
+  global $VarIndex,$FmtV,$VarLinkMissingFmt,$VarLinkExistsFmt;
+  SDV($VarLinkMissingFmt,'$LinkText');
+  SDV($VarLinkExistsFmt,"<a class='varlink' href='\$LinkUrl'><code class='varlink'>\$LinkText</code></a>");
+  VarIndexLoad($pagename);
+  $FmtV['$LinkText'] = str_replace('$', '&#36;', $txt);
+  $FmtV['$LinkUrl'] = @$VarIndex[$tgt]['url'];
+  if (@!$VarIndex[$tgt]['url'])
+    return FmtPageName($VarLinkMissingFmt,$pagename);
+  return FmtPageName($VarLinkExistsFmt,$pagename);
+}
+
+function VarIndexLoad($pagename) {
+  global $VarPagesFmt,$VarIndex,$WikiWordPattern;
+  static $loaded;
+  $VarIndex = (array)@$VarIndex;
+  if ($loaded) return;
+  foreach($VarPagesFmt as $vf) {
+    $v = FmtPageName($vf, $pagename);
+    if (@$loaded[$v]) continue;
+    $vlist = array($v);
+    $t = ReadTrail($pagename,$v);
+    if ($t) 
+      for($i=0;$i<count($t);$i++) 
+        if (@!$loaded[$t[$i]['pagename']]) $vlist[]=$t[$i]['pagename'];
+    foreach($vlist as $vname) {
+      $vpage = ReadPage($vname); @$loaded[$vname]++;
+      if (!$vpage) continue;
+      if (!preg_match_all("/\n:\\$([[:upper:]]\\w+):/",@$vpage['text'],$match))
+        continue;
+      foreach($match[1] as $n) {
+        $VarIndex[$n]['pagename'] = $vname;
+        $VarIndex[$n]['url'] = FmtPageName("{\$PageUrl}#$n",$vname);
+      }
+    }
+  }
+}
+
+# VarIndexList() generates a table of all indexed variables.
+function VarIndexList($pagename) {
+  global $VarIndex;
+  if (!isset($VarIndex)) VarIndexLoad($pagename);
+  ksort($VarIndex);
+  $out = "<table><tr><th>Variable</th><th>Documented in</th></tr>\n";
+  foreach($VarIndex as $v=>$a) 
+    $out .= FmtPageName("<tr><td><a class='varlink' 
+      href='{$a['url']}'><code>&#036;$v</code></a></td><td><a 
+      href='{\$PageUrl}'>{\$Name}</a></td></tr>\n",$a['pagename']);
+  $out .= "</table>";
+  return $out;
+}
+

Added: trunk/oggdsf/website/scripts/version.php
===================================================================
--- trunk/oggdsf/website/scripts/version.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/version.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1 @@
+<?php $Version="pmwiki-2.2.0-beta65"; $VersionNum=2001965; 
\ No newline at end of file

Added: trunk/oggdsf/website/scripts/wikistyles.php
===================================================================
--- trunk/oggdsf/website/scripts/wikistyles.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/wikistyles.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,185 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2004-2007 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+*/
+
+SDV($WikiStylePattern,'%%|%[A-Za-z][-,=:#\\w\\s\'"().]*%');
+
+## %% markup
+Markup('%%','style','%','return ApplyStyles($x);');
+
+## %define=...% markup on a line by itself
+Markup('%define=', '>split',
+  "/^(?=%define=)((?:$WikiStylePattern)\\s*)+$/e",
+  "PZZ(ApplyStyles(PSS('$0')))");
+
+## restore links before applying styles
+Markup('restorelinks','<%%',"/$KeepToken(\\d+L)$KeepToken/e",
+  '$GLOBALS[\'KPV\'][\'$1\']');
+
+# define PmWiki's standard/default wikistyles
+if (IsEnabled($EnableStdWikiStyles,1)) {
+  ## standard colors
+  foreach(array('black','white','red','yellow','blue','gray',
+      'silver','maroon','green','navy','purple') as $c)
+    SDV($WikiStyle[$c]['color'],$c);
+  ## %newwin% style opens links in a new window
+  SDV($WikiStyle['newwin']['target'],'_blank');
+  ## %comment% style turns markup into a comment via display:none css
+  SDV($WikiStyle['comment']['display'],'none');
+  ## display, margin, padding, and border css properties
+  $WikiStyleCSS[] = 
+    'float|display|(margin|padding|border)(-(left|right|top|bottom))?';
+  $WikiStyleCSS[] = 'white-space';
+  ## list-styles
+  $WikiStyleCSS[] = 'list-style';
+  $WikiStyleCSS[] = 'width|height';
+  foreach(array('decimal'=>'decimal', 'roman'=>'lower-roman',
+    'ROMAN'=>'upper-roman', 'alpha'=>'lower-alpha', 'ALPHA'=>'upper-alpha')
+    as $k=>$v) 
+      SDV($WikiStyle[$k],array('apply'=>'list','list-style'=>$v));
+  ## apply ranges
+  SDVA($WikiStyleApply,array(
+    'item' => 'li|dt',
+    'list' => 'ul|ol|dl',
+    'div' => 'div',
+    'pre' => 'pre',
+    'img' => 'img',
+    'block' => 'p(?!\\sclass=)|div|ul|ol|dl|li|dt|pre|h[1-6]',
+    'p' => 'p(?!\\sclass=)'));
+  foreach(array('item', 'list', 'block', 'p', 'div') as $c)
+    SDV($WikiStyle[$c],array('apply'=>$c));
+  ## block justifications
+  foreach(array('left','right','center') as $c)
+    SDV($WikiStyle[$c],array('apply'=>'block','text-align'=>$c));
+  ## frames, floating frames, and floats
+  SDV($HTMLStylesFmt['wikistyles'], " 
+    .frame 
+      { border:1px solid #cccccc; padding:4px; background-color:#f9f9f9; }
+    .lfloat { float:left; margin-right:0.5em; }
+    .rfloat { float:right; margin-left:0.5em; }\n");
+  SDV($WikiStyle['thumb'], array('width' => '100px'));
+  SDV($WikiStyle['frame'], array('class' => 'frame'));
+  SDV($WikiStyle['lframe'], array('class' => 'frame lfloat'));
+  SDV($WikiStyle['rframe'], array('class' => 'frame rfloat'));
+  SDV($WikiStyle['cframe'], array(
+    'class' => 'frame', 'margin-left' => 'auto', 'margin-right' => 'auto',
+    'width' => '200px', 'apply' => 'block', 'text-align' => 'center'));
+  ##  preformatted text sections
+  SDV($WikiStyle['pre'], array('apply' => 'block', 'white-space' => 'pre'));
+  SDV($WikiStyle['sidehead'], array('apply' => 'block', 'class' => 'sidehead'));
+}
+
+SDVA($WikiStyleAttr,array(
+  'vspace' => 'img',
+  'hspace' => 'img',
+  'align' => 'img',
+  'value' => 'li',
+  'target' => 'a',
+  'accesskey' => 'a',
+  'rel' => 'a'));
+
+SDVA($WikiStyleRepl,array(
+  '/^%(.*)%$/' => '$1',
+  '/\\bbgcolor([:=])/' => 'background-color$1',
+  '/\\b(\d+)pct\\b/' => '$1%',
+  ));
+
+$WikiStyleCSS[] = 'color|background-color';
+$WikiStyleCSS[] = 'text-align|text-decoration';
+$WikiStyleCSS[] = 'font-size|font-family|font-weight|font-style';
+
+SDV($imgTag, '(?:img|object|embed)');  SDV($aTag, 'a'); SDV($spanTag, 'span');
+
+function ApplyStyles($x) {
+  global $UrlExcludeChars, $WikiStylePattern, $WikiStyleRepl, $WikiStyle,
+    $WikiStyleAttr, $WikiStyleCSS, $WikiStyleApply, $BlockPattern,
+    $WikiStyleTag, $imgTag, $aTag, $spanTag, $WikiStyleAttrPrefix;
+  $wt = @$WikiStyleTag; $ns = $WikiStyleAttrPrefix; $ws = '';
+  $x = preg_replace("/\\b(href|src)=(['\"]?)[^$UrlExcludeChars]+\\2/e", 
+                    "Keep(PSS('$0'))", $x);
+  $x = preg_replace("/\\bhttps?:[^$UrlExcludeChars]+/e", "Keep('$0')", $x);
+  $parts = preg_split("/($WikiStylePattern)/",$x,-1,PREG_SPLIT_DELIM_CAPTURE);
+  $parts[] = NULL;
+  $out = '';
+  $style = array();
+  $wikicsspat = '/^('.implode('|',(array)$WikiStyleCSS).')$/';
+  while ($parts) {
+    $p = array_shift($parts);
+    if (preg_match("/^$WikiStylePattern\$/",$p)) {
+      $WikiStyle['curr']=$style; $style=array();
+      foreach((array)$WikiStyleRepl as $pat=>$rep) 
+        $p=preg_replace($pat,$rep,$p);
+      preg_match_all(
+        '/\\b([a-zA-Z][-\\w]*)([:=]([-#,\\w.()%]+|([\'"]).*?\\4))?/',
+        $p, $match, PREG_SET_ORDER);
+      while ($match) {
+        $m = array_shift($match);
+        if (@$m[2]) $style[$m[1]]=preg_replace('/^([\'"])(.*)\\1$/','$2',$m[3]);
+        else if (!isset($WikiStyle[$m[1]])) @$style['class'] .= ' ' . $m[1];
+        else {
+          $c = @$style['class'];
+          $style=array_merge($style,(array)$WikiStyle[$m[1]]);
+          if ($c) $style['class'] = $c . ' ' . $style['class'];
+        }
+      }
+      if (@$style['define']) {
+        $d = $style['define']; unset($style['define']);
+        $WikiStyle[$d] = $style;
+      }
+      if (@$WikiStyleApply[$style['apply']]) {
+        $apply[$style['apply']] = 
+          array_merge((array)@$apply[$style['apply']],$style);
+        $style=array();
+      }
+      continue;
+    }
+    if (is_null($p)) 
+      { $alist=@$apply; unset($alist['']); $p=$out; $out=''; }
+    elseif ($p=='') continue;
+    else { $alist=array(''=>$style); }
+    foreach((array)$alist as $a=>$s) {
+      $spanattr = ''; $stylev = array(); $id = '';
+      foreach((array)$s as $k=>$v) {
+        $v = trim($v);
+        if ($wt) $ws = str_replace('$1', "$ns$k='$v'", $wt);
+        if ($k == 'class' && $v) $spanattr = "{$ns}class='$v'";
+        elseif ($k=='id') $id = preg_replace('/[^-A-Za-z0-9:_.]+/', '_', $v);
+        elseif (($k=='width' || $k=='height') && !@$WikiStyleApply[$a]
+            && preg_match("/\\s*<$imgTag\\b/", $p)) 
+          $p = preg_replace("/<($imgTag)\\b(?![^>]*\\s$k=)/", 
+                 "$ws<$1 $ns$k='$v'", $p);
+        elseif (@$WikiStyleAttr[$k]) 
+          $p = preg_replace(
+                 "/<({$WikiStyleAttr[$k]}(?![^>]*\\s(?:$ns)?$k=))([^>]*)>/s",
+                 "$ws<$1 $ns$k='$v' $2>", $p);
+        elseif (preg_match($wikicsspat,$k)) $stylev[]="$k: $v;";
+      }
+      if ($stylev) $spanattr .= " {$ns}style='".implode(' ',$stylev)."'";
+      if ($id) $spanattr .= " {$ns}id='$id'";
+      if ($spanattr) {
+        if ($wt) $ws = str_replace('$1', $spanattr, $wt);
+        if (!@$WikiStyleApply[$a]) {
+          $p = preg_replace("!^(.*?)($|</?($BlockPattern))!s", 
+                            "$ws<$spanTag $spanattr>$1</$spanTag>$2", $p, 1);
+}
+        elseif (!preg_match('/^(\\s*<[^>]+>)*$/s',$p) ||
+                preg_match("/<$imgTag\\b/", $p)) {
+          $p = preg_replace("/<({$WikiStyleApply[$a]})\\b/",
+                 "$ws<$1 $spanattr", $p);
+        }
+      }
+      if (@$s['color']) {
+        $colorattr = "{$ns}style='color: {$s['color']}'";
+        if ($wt) $ws = str_replace('$1', $colorattr, $wt);
+        $p = preg_replace("/<$aTag\\b/", "$ws<$aTag $colorattr", $p);
+      }
+    }
+    $out .= $p;
+  }
+  return $out;
+}
+

Added: trunk/oggdsf/website/scripts/wikiwords.php
===================================================================
--- trunk/oggdsf/website/scripts/wikiwords.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/wikiwords.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,69 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2001-2007 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This script adds WikiWord (CamelCase) processing to PmWiki.
+    Originally WikiWords were part of the default configuration,
+    but their usage has died out over time and so it's now optional.
+
+    To enable WikiWord links, simply add the following to
+    a local customization file:
+
+        $EnableWikiWords = 1;
+
+    To have PmWiki recognize and process WikiWords but not link
+    them (i.e., the default behavior in PmWiki 2.1), also add
+
+        $LinkWikiWords = 0;
+
+    If you want only the first occurrence of a WikiWord to be converted
+    to a link, set $WikiWordCountMax=1.
+
+        $WikiWordCountMax = 1;         # converts only first WikiWord
+        $WikiWordCountMax = 0;         # another way to disable WikiWord links
+
+    The $WikiWordCount array can be used to control the number of times
+    a WikiWord is converted to a link.  This is useful for disabling
+    or limiting specific WikiWords.
+
+        $WikiWordCount['PhD'] = 0;         # disables 'PhD'
+        $WikiWordCount['PmWiki'] = 1;      # convert only first 'PmWiki'
+        $WikiWordCount['WikiWord'] = -1;   # ignore $SpaceWikiWord setting
+
+    By default, PmWiki is configured such that only the first occurrence
+    of 'PmWiki' in a page is treated as a WikiWord.  If you want to
+    restore 'PmWiki' to be treated like other WikiWords, uncomment the
+    line below.
+        unset($WikiWordCount['PmWiki']);
+
+    If you want to disable WikiWords matching a pattern, you can use
+    something like the following.  Note that the first argument has to
+    be different for each call to Markup().  The example below disables
+    WikiWord links like COM1, COM2, COM1234, etc.
+        Markup('COM\d+', '<wikilink', '/\\bCOM\\d+/', "Keep('$0')");
+*/
+
+SDV($LinkWikiWords, 1);
+
+## bare wikilinks
+Markup('wikilink', '>urllink',
+  "/\\b(?<![#&])($GroupPattern([\\/.]))?($WikiWordPattern)/e",
+  "Keep('<span class=\\'wikiword\\'>'.WikiLink(\$pagename,'$0').'</span>',
+        'L')");
+
+function WikiLink($pagename, $word) {
+  global $LinkWikiWords, $WikiWordCount, $SpaceWikiWords, $AsSpacedFunction,
+    $MarkupFrame, $WikiWordCountMax;
+  if (!$LinkWikiWords || ($WikiWordCount[$word] < 0)) return $word;
+  $text = ($SpaceWikiWords) ? $AsSpacedFunction($word) : $word;
+  $text = preg_replace('!.*/!', '', $text);
+  if (!isset($MarkupFrame[0]['wwcount'][$word]))
+    $MarkupFrame[0]['wwcount'][$word] = $WikiWordCountMax;
+  if ($MarkupFrame[0]['wwcount'][$word]-- < 1) return $text;
+  return MakeLink($pagename, $word, $text);
+}
+
+

Added: trunk/oggdsf/website/scripts/xlpage-utf-8.php
===================================================================
--- trunk/oggdsf/website/scripts/xlpage-utf-8.php	                        (rev 0)
+++ trunk/oggdsf/website/scripts/xlpage-utf-8.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,601 @@
+<?php if (!defined('PmWiki')) exit();
+/*  Copyright 2004-2007 Patrick R. Michaud (pmichaud at pobox.com)
+    This file is part of PmWiki; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published
+    by the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.  See pmwiki.php for full details.
+
+    This script configures PmWiki to use utf-8 in page content and
+    pagenames.  There are some unfortunate side effects about PHP's
+    utf-8 implementation, however.  First, since PHP doesn't have a
+    way to do pattern matching on upper/lowercase UTF-8 characters,
+    WikiWords are limited to the ASCII-7 set, and all links to page
+    names with UTF-8 characters have to be in double brackets.
+    Second, we have to assume that all non-ASCII characters are valid
+    in pagenames, since there's no way to determine which UTF-8
+    characters are "letters" and which are punctuation.
+*/
+
+global $HTTPHeaders, $KeepToken, $pagename,
+  $GroupPattern, $NamePattern, $WikiWordPattern, $SuffixPattern,
+  $PageNameChars, $MakePageNamePatterns, $CaseConversions, $Charset;
+
+$Charset = 'UTF-8';
+$HTTPHeaders['utf-8'] = 'Content-type: text/html; charset=UTF-8';
+$HTMLHeaderFmt['utf-8'] = 
+  "<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />";
+$pagename = @$_REQUEST['n'];
+if (!$pagename) $pagename = @$_REQUEST['pagename'];
+if (!$pagename &&
+      preg_match('!^'.preg_quote($_SERVER['SCRIPT_NAME'],'!').'/?([^?]*)!',
+          $_SERVER['REQUEST_URI'],$match))
+    $pagename = urldecode($match[1]);
+$pagename = preg_replace('!/+$!','',$pagename);
+$FmtPV['$RequestedPage'] = "'".htmlspecialchars($pagename, ENT_QUOTES)."'";
+
+$GroupPattern = '[\\w\\x80-\\xfe]+(?:-[[\\w\\x80-\\xfe]+)*';
+$NamePattern = '[\\w\\x80-\\xfe]+(?:-[[\\w\\x80-\\xfe]+)*';
+$WikiWordPattern = 
+  '[A-Z][A-Za-z0-9]*(?:[A-Z][a-z0-9]|[a-z0-9][A-Z])[A-Za-z0-9]*';
+$SuffixPattern = '(?:-?[A-Za-z0-9\\x80-\\xd6]+)*';
+
+SDV($PageNameChars, '-[:alnum:]\\x80-\\xfe');
+SDV($MakePageNamePatterns, array(
+    '/[?#].*$/' => '',                     # strip everything after ? or #
+    "/'/" => '',                           # strip single-quotes
+    "/[^$PageNameChars]+/" => ' ',         # convert everything else to space
+    '/(?<=^| )([a-z])/e' => "strtoupper('$1')", 
+    '/(?<=^| )([\\xc0-\\xdf].)/e' => "utf8toupper('$1')", 
+    '/ /' => ''));
+SDV($StrFoldFunction, 'utf8fold');
+
+$AsSpacedFunction = 'AsSpacedUTF8';
+
+function utf8toupper($x) {
+  global $CaseConversions;
+  if (strlen($x) <= 2 && @$CaseConversions[$x])
+    return $CaseConversions[$x];
+  static $lower, $upper;
+  if (!@$lower) { 
+    $lower = array_keys($CaseConversions); 
+    $upper = array_values($CaseConversions);
+  }
+  return str_replace($lower, $upper, $x);
+}
+
+
+function utf8fold($x) {
+  global $StringFolding;
+  static $source, $target;
+  if (!@$source) {
+    $source = array_keys($StringFolding);
+    $target = array_values($StringFolding);
+  }
+  return str_replace($source, $target, $x);
+}
+
+
+function AsSpacedUTF8($text) {
+  global $CaseConversions;
+  static $lower, $upper;
+  if (!@$CaseConversions) return AsSpaced($text);
+  if (!@$lower) {
+    $lower = implode('|', array_keys($CaseConversions));
+    $upper = implode('|', array_values($CaseConversions));
+  }
+  $text = preg_replace("/($lower|\\d)($upper)/", '$1 $2', $text);
+  $text = preg_replace('/([^-\\d])(\\d[-\\d]*( |$))/', '$1 $2', $text);
+  return preg_replace("/($upper)(($upper)($lower|\\d))/", '$1 $2', $text);
+}
+
+
+##   Conversion tables.  
+##   $CaseConversion maps lowercase utf8 sequences to 
+##   their uppercase equivalents.  The table was derived from [1].
+##   $StringFolding normalizes strings so that "equivalent"
+##   forms will match using a binary comparison (derived from [2]).
+##     [1] http://unicode.org/Public/UNIDATA/UnicodeData.txt
+##     [2] http://unicode.org/Public/UNIDATA/CaseFolding.txt
+
+SDV($CaseConversions, array(
+    ##   U+0060
+    "a" => "A", "b" => "B", "c" => "C", "d" => "D", "e" => "E", "f" => "F",
+    "g" => "G", "h" => "H", "i" => "I", "j" => "J", "k" => "K", "l" => "L",
+    "m" => "M", "n" => "N", "o" => "O", "p" => "P", "q" => "Q", "r" => "R",
+    "s" => "S", "t" => "T", "u" => "U", "v" => "V", "w" => "W", "x" => "X",
+    "y" => "Y", "z" => "Z",
+    ##   U+00b5
+    "\xc2\xb5" => "\xce\x9c",
+    ##   U+00E0 to U+00FF
+    "\xc3\xa0" => "\xc3\x80",  "\xc3\xa1" => "\xc3\x81",
+    "\xc3\xa2" => "\xc3\x82",  "\xc3\xa3" => "\xc3\x83",
+    "\xc3\xa4" => "\xc3\x84",  "\xc3\xa5" => "\xc3\x85",
+    "\xc3\xa6" => "\xc3\x86",  "\xc3\xa7" => "\xc3\x87",
+    "\xc3\xa8" => "\xc3\x88",  "\xc3\xa9" => "\xc3\x89",
+    "\xc3\xaa" => "\xc3\x8a",  "\xc3\xab" => "\xc3\x8b",
+    "\xc3\xac" => "\xc3\x8c",  "\xc3\xad" => "\xc3\x8d",
+    "\xc3\xae" => "\xc3\x8e",  "\xc3\xaf" => "\xc3\x8f",
+    "\xc3\xb0" => "\xc3\x90",  "\xc3\xb1" => "\xc3\x91",
+    "\xc3\xb2" => "\xc3\x92",  "\xc3\xb3" => "\xc3\x93",
+    "\xc3\xb4" => "\xc3\x94",  "\xc3\xb5" => "\xc3\x95",
+    "\xc3\xb6" => "\xc3\x96",  "\xc3\xb8" => "\xc3\x98",
+    "\xc3\xb9" => "\xc3\x99",  "\xc3\xba" => "\xc3\x9a",
+    "\xc3\xbb" => "\xc3\x9b",  "\xc3\xbc" => "\xc3\x9c",
+    "\xc3\xbd" => "\xc3\x9d",  "\xc3\xbe" => "\xc3\x9e",
+    "\xc3\xbf" => "\xc5\xb8",  
+    ##   U+0100
+    "\xc4\x81" => "\xc4\x80",  "\xc4\x83" => "\xc4\x82",
+    "\xc4\x85" => "\xc4\x84",  "\xc4\x87" => "\xc4\x86",
+    "\xc4\x89" => "\xc4\x88",  "\xc4\x8b" => "\xc4\x8a",
+    "\xc4\x8d" => "\xc4\x8c",  "\xc4\x8f" => "\xc4\x8e",
+    "\xc4\x91" => "\xc4\x90",  "\xc4\x93" => "\xc4\x92",
+    "\xc4\x95" => "\xc4\x94",  "\xc4\x97" => "\xc4\x96",
+    "\xc4\x99" => "\xc4\x98",  "\xc4\x9b" => "\xc4\x9a",
+    "\xc4\x9d" => "\xc4\x9c",  "\xc4\x9f" => "\xc4\x9e",
+    "\xc4\xa1" => "\xc4\xa0",  "\xc4\xa3" => "\xc4\xa2",
+    "\xc4\xa5" => "\xc4\xa4",  "\xc4\xa7" => "\xc4\xa6",
+    "\xc4\xa9" => "\xc4\xa8",  "\xc4\xab" => "\xc4\xaa",
+    "\xc4\xad" => "\xc4\xac",  "\xc4\xaf" => "\xc4\xae",
+    "\xc4\xb1" => "I",  "\xc4\xb3" => "\xc4\xb2",
+    "\xc4\xb5" => "\xc4\xb4",  "\xc4\xb7" => "\xc4\xb6",
+    "\xc4\xba" => "\xc4\xb9",  "\xc4\xbc" => "\xc4\xbb",
+    "\xc4\xbe" => "\xc4\xbd",  
+    ##   U+0140
+    "\xc5\x80" => "\xc4\xbf",  "\xc5\x82" => "\xc5\x81", 
+    "\xc5\x84" => "\xc5\x83",  "\xc5\x86" => "\xc5\x85", 
+    "\xc5\x88" => "\xc5\x87",  "\xc5\x8b" => "\xc5\x8a",
+    "\xc5\x8d" => "\xc5\x8c",  "\xc5\x8f" => "\xc5\x8e",
+    "\xc5\x91" => "\xc5\x90",  "\xc5\x93" => "\xc5\x92",
+    "\xc5\x95" => "\xc5\x94",  "\xc5\x97" => "\xc5\x96",
+    "\xc5\x99" => "\xc5\x98",  "\xc5\x9b" => "\xc5\x9a",
+    "\xc5\x9d" => "\xc5\x9c",  "\xc5\x9f" => "\xc5\x9e",
+    "\xc5\xa1" => "\xc5\xa0",  "\xc5\xa3" => "\xc5\xa2",
+    "\xc5\xa5" => "\xc5\xa4",  "\xc5\xa7" => "\xc5\xa6",
+    "\xc5\xa9" => "\xc5\xa8",  "\xc5\xab" => "\xc5\xaa",
+    "\xc5\xad" => "\xc5\xac",  "\xc5\xaf" => "\xc5\xae",
+    "\xc5\xb1" => "\xc5\xb0",  "\xc5\xb3" => "\xc5\xb2",
+    "\xc5\xb5" => "\xc5\xb4",  "\xc5\xb7" => "\xc5\xb6",
+    "\xc5\xba" => "\xc5\xb9",  "\xc5\xbc" => "\xc5\xbb",
+    "\xc5\xbe" => "\xc5\xbd",  "\xc5\xbf" => "S",
+    ##   U+0180
+    "\xc6\x80" => "\xc9\x83",  "\xc6\x83" => "\xc6\x82",
+    "\xc6\x85" => "\xc6\x84",  "\xc6\x88" => "\xc6\x87",
+    "\xc6\x8c" => "\xc6\x8b",  "\xc6\x92" => "\xc6\x91",
+    "\xc6\x95" => "\xc7\xb6",  "\xc6\x99" => "\xc6\x98",
+    "\xc6\x9a" => "\xc8\xbd",  "\xc6\x9e" => "\xc8\xa0",
+    "\xc6\xa1" => "\xc6\xa0",  "\xc6\xa3" => "\xc6\xa2",
+    "\xc6\xa5" => "\xc6\xa4",  "\xc6\xa8" => "\xc6\xa7",
+    "\xc6\xad" => "\xc6\xac",  "\xc6\xb0" => "\xc6\xaf",
+    "\xc6\xb4" => "\xc6\xb3",  "\xc6\xb6" => "\xc6\xb5",
+    "\xc6\xb9" => "\xc6\xb8",  "\xc6\xbd" => "\xc6\xbc",
+    "\xc6\xbf" => "\xc7\xb7",  
+    ##   U+01c0
+    "\xc7\x85" => "\xc7\x84",  "\xc7\x86" => "\xc7\x84", 
+    "\xc7\x88" => "\xc7\x87",  "\xc7\x89" => "\xc7\x87",
+    "\xc7\x8b" => "\xc7\x8a",  "\xc7\x8c" => "\xc7\x8a",
+    "\xc7\x8e" => "\xc7\x8d",  "\xc7\x90" => "\xc7\x8f",
+    "\xc7\x92" => "\xc7\x91",  "\xc7\x94" => "\xc7\x93",
+    "\xc7\x96" => "\xc7\x95",  "\xc7\x98" => "\xc7\x97",
+    "\xc7\x9a" => "\xc7\x99",  "\xc7\x9c" => "\xc7\x9b",
+    "\xc7\x9d" => "\xc6\x8e",  "\xc7\x9f" => "\xc7\x9e",
+    "\xc7\xa1" => "\xc7\xa0",  "\xc7\xa3" => "\xc7\xa2",
+    "\xc7\xa5" => "\xc7\xa4",  "\xc7\xa7" => "\xc7\xa6",
+    "\xc7\xa9" => "\xc7\xa8",  "\xc7\xab" => "\xc7\xaa",
+    "\xc7\xad" => "\xc7\xac",  "\xc7\xaf" => "\xc7\xae",
+    "\xc7\xb2" => "\xc7\xb1",  "\xc7\xb3" => "\xc7\xb1",
+    "\xc7\xb5" => "\xc7\xb4",  "\xc7\xb9" => "\xc7\xb8",
+    "\xc7\xbb" => "\xc7\xba",  "\xc7\xbd" => "\xc7\xbc",
+    "\xc7\xbf" => "\xc7\xbe",
+    ##   U+0200
+    "\xc8\x81" => "\xc8\x80",  "\xc8\x83" => "\xc8\x82",
+    "\xc8\x85" => "\xc8\x84",  "\xc8\x87" => "\xc8\x86",
+    "\xc8\x89" => "\xc8\x88",  "\xc8\x8b" => "\xc8\x8a",
+    "\xc8\x8d" => "\xc8\x8c",  "\xc8\x8f" => "\xc8\x8e",
+    "\xc8\x91" => "\xc8\x90",  "\xc8\x93" => "\xc8\x92",
+    "\xc8\x95" => "\xc8\x94",  "\xc8\x97" => "\xc8\x96",
+    "\xc8\x99" => "\xc8\x98",  "\xc8\x9b" => "\xc8\x9a",
+    "\xc8\x9d" => "\xc8\x9c",  "\xc8\x9f" => "\xc8\x9e",
+    "\xc8\xa3" => "\xc8\xa2",  "\xc8\xa5" => "\xc8\xa4",
+    "\xc8\xa7" => "\xc8\xa6",  "\xc8\xa9" => "\xc8\xa8",
+    "\xc8\xab" => "\xc8\xaa",  "\xc8\xad" => "\xc8\xac",
+    "\xc8\xaf" => "\xc8\xae",  "\xc8\xb1" => "\xc8\xb0",
+    "\xc8\xb3" => "\xc8\xb2",  "\xc8\xbc" => "\xc8\xbb",
+    ##   U+0240
+    "\xc9\x82" => "\xc9\x81",  "\xc9\x87" => "\xc9\x86",
+    "\xc9\x89" => "\xc9\x88",  "\xc9\x8b" => "\xc9\x8a",
+    "\xc9\x8d" => "\xc9\x8c",  "\xc9\x8f" => "\xc9\x8e",
+    "\xc9\x93" => "\xc6\x81",  "\xc9\x94" => "\xc6\x86",
+    "\xc9\x96" => "\xc6\x89",  "\xc9\x97" => "\xc6\x8a",
+    "\xc9\x99" => "\xc6\x8f",  "\xc9\x9b" => "\xc6\x90",
+    "\xc9\xa0" => "\xc6\x93",  "\xc9\xa3" => "\xc6\x94",
+    "\xc9\xa8" => "\xc6\x97",  "\xc9\xa9" => "\xc6\x96",
+    "\xc9\xab" => "\xe2\xb1\xa2",  "\xc9\xaf" => "\xc6\x9c",  
+    "\xc9\xb2" => "\xc6\x9d",  "\xc9\xb5" => "\xc6\x9f",  
+    "\xc9\xbd" => "\xe2\xb1\xa4",
+    ##   U+0280
+    "\xca\x80" => "\xc6\xa6",  "\xca\x83" => "\xc6\xa9",
+    "\xca\x88" => "\xc6\xae",  "\xca\x89" => "\xc9\x84",
+    "\xca\x8a" => "\xc6\xb1",  "\xca\x8b" => "\xc6\xb2",
+    "\xca\x8c" => "\xc9\x85",  "\xca\x92" => "\xc6\xb7",
+    ##   U+0340
+    "\xcd\x85" => "\xce\x99",  "\xcd\xbb" => "\xcf\xbd",
+    "\xcd\xbc" => "\xcf\xbe",  "\xcd\xbd" => "\xcf\xbf",
+    ##   U+0380
+    "\xce\xac" => "\xce\x86",  "\xce\xad" => "\xce\x88",
+    "\xce\xae" => "\xce\x89",  "\xce\xaf" => "\xce\x8a",
+    "\xce\xb1" => "\xce\x91",  "\xce\xb2" => "\xce\x92",
+    "\xce\xb3" => "\xce\x93",  "\xce\xb4" => "\xce\x94",
+    "\xce\xb5" => "\xce\x95",  "\xce\xb6" => "\xce\x96",
+    "\xce\xb7" => "\xce\x97",  "\xce\xb8" => "\xce\x98",
+    "\xce\xb9" => "\xce\x99",  "\xce\xba" => "\xce\x9a",
+    "\xce\xbb" => "\xce\x9b",  "\xce\xbc" => "\xce\x9c",
+    "\xce\xbd" => "\xce\x9d",  "\xce\xbe" => "\xce\x9e",
+    "\xce\xbf" => "\xce\x9f",  
+    ##   U+03c0
+    "\xcf\x80" => "\xce\xa0",  "\xcf\x81" => "\xce\xa1",
+    "\xcf\x82" => "\xce\xa3",  "\xcf\x83" => "\xce\xa3",
+    "\xcf\x84" => "\xce\xa4",  "\xcf\x85" => "\xce\xa5",
+    "\xcf\x86" => "\xce\xa6",  "\xcf\x87" => "\xce\xa7",
+    "\xcf\x88" => "\xce\xa8",  "\xcf\x89" => "\xce\xa9",
+    "\xcf\x8a" => "\xce\xaa",  "\xcf\x8b" => "\xce\xab",
+    "\xcf\x8c" => "\xce\x8c",  "\xcf\x8d" => "\xce\x8e",
+    "\xcf\x8e" => "\xce\x8f",  "\xcf\x90" => "\xce\x92",
+    "\xcf\x91" => "\xce\x98",  "\xcf\x95" => "\xce\xa6",
+    "\xcf\x96" => "\xce\xa0",  "\xcf\x99" => "\xcf\x98",
+    "\xcf\x9b" => "\xcf\x9a",  "\xcf\x9d" => "\xcf\x9c",
+    "\xcf\x9f" => "\xcf\x9e",  "\xcf\xa1" => "\xcf\xa0",
+    "\xcf\xa3" => "\xcf\xa2",  "\xcf\xa5" => "\xcf\xa4",
+    "\xcf\xa7" => "\xcf\xa6",  "\xcf\xa9" => "\xcf\xa8",
+    "\xcf\xab" => "\xcf\xaa",  "\xcf\xad" => "\xcf\xac",
+    "\xcf\xaf" => "\xcf\xae",  "\xcf\xb0" => "\xce\x9a",
+    "\xcf\xb1" => "\xce\xa1",  "\xcf\xb2" => "\xcf\xb9",
+    "\xcf\xb5" => "\xce\x95",  "\xcf\xb8" => "\xcf\xb7",
+    "\xcf\xbb" => "\xcf\xba",
+    ##   U+0400
+    "\xd0\xb0" => "\xd0\x90",  "\xd0\xb1" => "\xd0\x91",
+    "\xd0\xb2" => "\xd0\x92",  "\xd0\xb3" => "\xd0\x93",
+    "\xd0\xb4" => "\xd0\x94",  "\xd0\xb5" => "\xd0\x95",
+    "\xd0\xb6" => "\xd0\x96",  "\xd0\xb7" => "\xd0\x97",
+    "\xd0\xb8" => "\xd0\x98",  "\xd0\xb9" => "\xd0\x99",
+    "\xd0\xba" => "\xd0\x9a",  "\xd0\xbb" => "\xd0\x9b",
+    "\xd0\xbc" => "\xd0\x9c",  "\xd0\xbd" => "\xd0\x9d",
+    "\xd0\xbe" => "\xd0\x9e",  "\xd0\xbf" => "\xd0\x9f",
+    ##   U+0440
+    "\xd1\x80" => "\xd0\xa0",  "\xd1\x81" => "\xd0\xa1",
+    "\xd1\x82" => "\xd0\xa2",  "\xd1\x83" => "\xd0\xa3",
+    "\xd1\x84" => "\xd0\xa4",  "\xd1\x85" => "\xd0\xa5",
+    "\xd1\x86" => "\xd0\xa6",  "\xd1\x87" => "\xd0\xa7",
+    "\xd1\x88" => "\xd0\xa8",  "\xd1\x89" => "\xd0\xa9",
+    "\xd1\x8a" => "\xd0\xaa",  "\xd1\x8b" => "\xd0\xab",
+    "\xd1\x8c" => "\xd0\xac",  "\xd1\x8d" => "\xd0\xad",
+    "\xd1\x8e" => "\xd0\xae",  "\xd1\x8f" => "\xd0\xaf",
+    "\xd1\x90" => "\xd0\x80",  "\xd1\x91" => "\xd0\x81",
+    "\xd1\x92" => "\xd0\x82",  "\xd1\x93" => "\xd0\x83",
+    "\xd1\x94" => "\xd0\x84",  "\xd1\x95" => "\xd0\x85",
+    "\xd1\x96" => "\xd0\x86",  "\xd1\x97" => "\xd0\x87",
+    "\xd1\x98" => "\xd0\x88",  "\xd1\x99" => "\xd0\x89",
+    "\xd1\x9a" => "\xd0\x8a",  "\xd1\x9b" => "\xd0\x8b",
+    "\xd1\x9c" => "\xd0\x8c",  "\xd1\x9d" => "\xd0\x8d",
+    "\xd1\x9e" => "\xd0\x8e",  "\xd1\x9f" => "\xd0\x8f",
+    "\xd1\xa1" => "\xd1\xa0",  "\xd1\xa3" => "\xd1\xa2",
+    "\xd1\xa5" => "\xd1\xa4",  "\xd1\xa7" => "\xd1\xa6",
+    "\xd1\xa9" => "\xd1\xa8",  "\xd1\xab" => "\xd1\xaa",
+    "\xd1\xad" => "\xd1\xac",  "\xd1\xaf" => "\xd1\xae",
+    "\xd1\xb1" => "\xd1\xb0",  "\xd1\xb3" => "\xd1\xb2",
+    "\xd1\xb5" => "\xd1\xb4",  "\xd1\xb7" => "\xd1\xb6",
+    "\xd1\xb9" => "\xd1\xb8",  "\xd1\xbb" => "\xd1\xba",
+    "\xd1\xbd" => "\xd1\xbc",  "\xd1\xbf" => "\xd1\xbe",
+    ##   U+0480
+    "\xd2\x81" => "\xd2\x80",  "\xd2\x8b" => "\xd2\x8a",
+    "\xd2\x8d" => "\xd2\x8c",  "\xd2\x8f" => "\xd2\x8e",
+    "\xd2\x91" => "\xd2\x90",  "\xd2\x93" => "\xd2\x92",
+    "\xd2\x95" => "\xd2\x94",  "\xd2\x97" => "\xd2\x96",
+    "\xd2\x99" => "\xd2\x98",  "\xd2\x9b" => "\xd2\x9a",
+    "\xd2\x9d" => "\xd2\x9c",  "\xd2\x9f" => "\xd2\x9e",
+    "\xd2\xa1" => "\xd2\xa0",  "\xd2\xa3" => "\xd2\xa2",
+    "\xd2\xa5" => "\xd2\xa4",  "\xd2\xa7" => "\xd2\xa6",
+    "\xd2\xa9" => "\xd2\xa8",  "\xd2\xab" => "\xd2\xaa",
+    "\xd2\xad" => "\xd2\xac",  "\xd2\xaf" => "\xd2\xae",
+    "\xd2\xb1" => "\xd2\xb0",  "\xd2\xb3" => "\xd2\xb2",
+    "\xd2\xb5" => "\xd2\xb4",  "\xd2\xb7" => "\xd2\xb6",
+    "\xd2\xb9" => "\xd2\xb8",  "\xd2\xbb" => "\xd2\xba",
+    "\xd2\xbd" => "\xd2\xbc",  "\xd2\xbf" => "\xd2\xbe",
+    ##   U+04c0
+    "\xd3\x82" => "\xd3\x81",  "\xd3\x84" => "\xd3\x83",
+    "\xd3\x86" => "\xd3\x85",  "\xd3\x88" => "\xd3\x87",
+    "\xd3\x8a" => "\xd3\x89",  "\xd3\x8c" => "\xd3\x8b",
+    "\xd3\x8e" => "\xd3\x8d",  "\xd3\x8f" => "\xd3\x80",
+    "\xd3\x91" => "\xd3\x90",  "\xd3\x93" => "\xd3\x92",
+    "\xd3\x95" => "\xd3\x94",  "\xd3\x97" => "\xd3\x96",
+    "\xd3\x99" => "\xd3\x98",  "\xd3\x9b" => "\xd3\x9a",
+    "\xd3\x9d" => "\xd3\x9c",  "\xd3\x9f" => "\xd3\x9e",
+    "\xd3\xa1" => "\xd3\xa0",  "\xd3\xa3" => "\xd3\xa2",
+    "\xd3\xa5" => "\xd3\xa4",  "\xd3\xa7" => "\xd3\xa6",
+    "\xd3\xa9" => "\xd3\xa8",  "\xd3\xab" => "\xd3\xaa",
+    "\xd3\xad" => "\xd3\xac",  "\xd3\xaf" => "\xd3\xae",
+    "\xd3\xb1" => "\xd3\xb0",  "\xd3\xb3" => "\xd3\xb2",
+    "\xd3\xb5" => "\xd3\xb4",  "\xd3\xb7" => "\xd3\xb6",
+    "\xd3\xb9" => "\xd3\xb8",  "\xd3\xbb" => "\xd3\xba",
+    "\xd3\xbd" => "\xd3\xbc",  "\xd3\xbf" => "\xd3\xbe",
+    ##   U+0500
+    "\xd4\x81" => "\xd4\x80",  "\xd4\x83" => "\xd4\x82",
+    "\xd4\x85" => "\xd4\x84",  "\xd4\x87" => "\xd4\x86",
+    "\xd4\x89" => "\xd4\x88",  "\xd4\x8b" => "\xd4\x8a",
+    "\xd4\x8d" => "\xd4\x8c",  "\xd4\x8f" => "\xd4\x8e",
+    "\xd4\x91" => "\xd4\x90",  "\xd4\x93" => "\xd4\x92",
+    ##   U+0560
+    "\xd5\xa1" => "\xd4\xb1",  "\xd5\xa2" => "\xd4\xb2",
+    "\xd5\xa3" => "\xd4\xb3",  "\xd5\xa4" => "\xd4\xb4",
+    "\xd5\xa5" => "\xd4\xb5",  "\xd5\xa6" => "\xd4\xb6",
+    "\xd5\xa7" => "\xd4\xb7",  "\xd5\xa8" => "\xd4\xb8",
+    "\xd5\xa9" => "\xd4\xb9",  "\xd5\xaa" => "\xd4\xba",
+    "\xd5\xab" => "\xd4\xbb",  "\xd5\xac" => "\xd4\xbc",
+    "\xd5\xad" => "\xd4\xbd",  "\xd5\xae" => "\xd4\xbe",
+    "\xd5\xaf" => "\xd4\xbf",  "\xd5\xb0" => "\xd5\x80",
+    "\xd5\xb1" => "\xd5\x81",  "\xd5\xb2" => "\xd5\x82",
+    "\xd5\xb3" => "\xd5\x83",  "\xd5\xb4" => "\xd5\x84",
+    "\xd5\xb5" => "\xd5\x85",  "\xd5\xb6" => "\xd5\x86",
+    "\xd5\xb7" => "\xd5\x87",  "\xd5\xb8" => "\xd5\x88",
+    "\xd5\xb9" => "\xd5\x89",  "\xd5\xba" => "\xd5\x8a",
+    "\xd5\xbb" => "\xd5\x8b",  "\xd5\xbc" => "\xd5\x8c",
+    "\xd5\xbd" => "\xd5\x8d",  "\xd5\xbe" => "\xd5\x8e",
+    "\xd5\xbf" => "\xd5\x8f",
+    ##   U+0580
+    "\xd6\x80" => "\xd5\x90",  "\xd6\x81" => "\xd5\x91",
+    "\xd6\x82" => "\xd5\x92",  "\xd6\x83" => "\xd5\x93",
+    "\xd6\x84" => "\xd5\x94",  "\xd6\x85" => "\xd5\x95",
+    "\xd6\x86" => "\xd5\x96"
+  ));
+
+SDV($StringFolding, array(
+    ##   U+0040
+    "A" => "a", "B" => "b", "C" => "c", "D" => "d", "E" => "e", "F" => "f",
+    "G" => "g", "H" => "h", "I" => "i", "J" => "j", "K" => "k", "L" => "l",
+    "M" => "m", "N" => "n", "O" => "o", "P" => "p", "Q" => "q", "R" => "r",
+    "S" => "s", "T" => "t", "U" => "u", "V" => "v", "W" => "w", "X" => "x",
+    "Y" => "y", "Z" => "z",
+    ##   U+00B5
+    "\xc2\xb5" => "\xce\xbc",
+    ##   U+00C0
+    "\xc3\x80" => "\xc3\xa0",  "\xc3\x81" => "\xc3\xa1",
+    "\xc3\x82" => "\xc3\xa2",  "\xc3\x83" => "\xc3\xa3",
+    "\xc3\x84" => "\xc3\xa4",  "\xc3\x85" => "\xc3\xa5",
+    "\xc3\x86" => "\xc3\xa6",  "\xc3\x87" => "\xc3\xa7",
+    "\xc3\x88" => "\xc3\xa8",  "\xc3\x89" => "\xc3\xa9",
+    "\xc3\x8a" => "\xc3\xaa",  "\xc3\x8b" => "\xc3\xab",
+    "\xc3\x8c" => "\xc3\xac",  "\xc3\x8d" => "\xc3\xad",
+    "\xc3\x8e" => "\xc3\xae",  "\xc3\x8f" => "\xc3\xaf",
+    "\xc3\x90" => "\xc3\xb0",  "\xc3\x91" => "\xc3\xb1",
+    "\xc3\x92" => "\xc3\xb2",  "\xc3\x93" => "\xc3\xb3",
+    "\xc3\x94" => "\xc3\xb4",  "\xc3\x95" => "\xc3\xb5",
+    "\xc3\x96" => "\xc3\xb6",  "\xc3\x98" => "\xc3\xb8",
+    "\xc3\x99" => "\xc3\xb9",  "\xc3\x9a" => "\xc3\xba",
+    "\xc3\x9b" => "\xc3\xbb",  "\xc3\x9c" => "\xc3\xbc",
+    "\xc3\x9d" => "\xc3\xbd",  "\xc3\x9e" => "\xc3\xbe",
+    "\xc3\x9f" => "ss",
+    ##   U+0100
+    "\xc4\x80" => "\xc4\x81",  "\xc4\x82" => "\xc4\x83",
+    "\xc4\x84" => "\xc4\x85",  "\xc4\x86" => "\xc4\x87",
+    "\xc4\x88" => "\xc4\x89",  "\xc4\x8a" => "\xc4\x8b",
+    "\xc4\x8c" => "\xc4\x8d",  "\xc4\x8e" => "\xc4\x8f",
+    "\xc4\x90" => "\xc4\x91",  "\xc4\x92" => "\xc4\x93",
+    "\xc4\x94" => "\xc4\x95",  "\xc4\x96" => "\xc4\x97",
+    "\xc4\x98" => "\xc4\x99",  "\xc4\x9a" => "\xc4\x9b",
+    "\xc4\x9c" => "\xc4\x9d",  "\xc4\x9e" => "\xc4\x9f",
+    "\xc4\xa0" => "\xc4\xa1",  "\xc4\xa2" => "\xc4\xa3",
+    "\xc4\xa4" => "\xc4\xa5",  "\xc4\xa6" => "\xc4\xa7",
+    "\xc4\xa8" => "\xc4\xa9",  "\xc4\xaa" => "\xc4\xab",
+    "\xc4\xac" => "\xc4\xad",  "\xc4\xae" => "\xc4\xaf",
+    "\xc4\xb0" => "i\xcc\x87",  "\xc4\xb2" => "\xc4\xb3",
+    "\xc4\xb4" => "\xc4\xb5",  "\xc4\xb6" => "\xc4\xb7",
+    "\xc4\xb9" => "\xc4\xba",  "\xc4\xbb" => "\xc4\xbc",
+    "\xc4\xbd" => "\xc4\xbe",  "\xc4\xbf" => "\xc5\x80",
+    ##   U+0140
+    "\xc5\x81" => "\xc5\x82",  "\xc5\x83" => "\xc5\x84",
+    "\xc5\x85" => "\xc5\x86",  "\xc5\x87" => "\xc5\x88",
+    "\xc5\x89" => "\xca\xbcn",  "\xc5\x8a" => "\xc5\x8b",
+    "\xc5\x8c" => "\xc5\x8d",  "\xc5\x8e" => "\xc5\x8f",
+    "\xc5\x90" => "\xc5\x91",  "\xc5\x92" => "\xc5\x93",
+    "\xc5\x94" => "\xc5\x95",  "\xc5\x96" => "\xc5\x97",
+    "\xc5\x98" => "\xc5\x99",  "\xc5\x9a" => "\xc5\x9b",
+    "\xc5\x9c" => "\xc5\x9d",  "\xc5\x9e" => "\xc5\x9f",
+    "\xc5\xa0" => "\xc5\xa1",  "\xc5\xa2" => "\xc5\xa3",
+    "\xc5\xa4" => "\xc5\xa5",  "\xc5\xa6" => "\xc5\xa7",
+    "\xc5\xa8" => "\xc5\xa9",  "\xc5\xaa" => "\xc5\xab",
+    "\xc5\xac" => "\xc5\xad",  "\xc5\xae" => "\xc5\xaf",
+    "\xc5\xb0" => "\xc5\xb1",  "\xc5\xb2" => "\xc5\xb3",
+    "\xc5\xb4" => "\xc5\xb5",  "\xc5\xb6" => "\xc5\xb7",
+    "\xc5\xb8" => "\xc3\xbf",  "\xc5\xb9" => "\xc5\xba",
+    "\xc5\xbb" => "\xc5\xbc",  "\xc5\xbd" => "\xc5\xbe",
+    "\xc5\xbf" => "s",
+    ##   U+0180
+    "\xc6\x81" => "\xc9\x93",  "\xc6\x82" => "\xc6\x83",
+    "\xc6\x84" => "\xc6\x85",  "\xc6\x86" => "\xc9\x94",
+    "\xc6\x87" => "\xc6\x88",  "\xc6\x89" => "\xc9\x96",
+    "\xc6\x8a" => "\xc9\x97",  "\xc6\x8b" => "\xc6\x8c",
+    "\xc6\x8e" => "\xc7\x9d",  "\xc6\x8f" => "\xc9\x99",
+    "\xc6\x90" => "\xc9\x9b",  "\xc6\x91" => "\xc6\x92",
+    "\xc6\x93" => "\xc9\xa0",  "\xc6\x94" => "\xc9\xa3",
+    "\xc6\x96" => "\xc9\xa9",  "\xc6\x97" => "\xc9\xa8",
+    "\xc6\x98" => "\xc6\x99",  "\xc6\x9c" => "\xc9\xaf",
+    "\xc6\x9d" => "\xc9\xb2",  "\xc6\x9f" => "\xc9\xb5",
+    "\xc6\xa0" => "\xc6\xa1",  "\xc6\xa2" => "\xc6\xa3",
+    "\xc6\xa4" => "\xc6\xa5",  "\xc6\xa6" => "\xca\x80",
+    "\xc6\xa7" => "\xc6\xa8",  "\xc6\xa9" => "\xca\x83",
+    "\xc6\xac" => "\xc6\xad",  "\xc6\xae" => "\xca\x88",
+    "\xc6\xaf" => "\xc6\xb0",  "\xc6\xb1" => "\xca\x8a",
+    "\xc6\xb2" => "\xca\x8b",  "\xc6\xb3" => "\xc6\xb4",
+    "\xc6\xb5" => "\xc6\xb6",  "\xc6\xb7" => "\xca\x92",
+    "\xc6\xb8" => "\xc6\xb9",  "\xc6\xbc" => "\xc6\xbd",
+    ##   U+01c0
+    "\xc7\x84" => "\xc7\x86",  "\xc7\x85" => "\xc7\x86",
+    "\xc7\x87" => "\xc7\x89",  "\xc7\x88" => "\xc7\x89",
+    "\xc7\x8a" => "\xc7\x8c",  "\xc7\x8b" => "\xc7\x8c",
+    "\xc7\x8d" => "\xc7\x8e",  "\xc7\x8f" => "\xc7\x90",
+    "\xc7\x91" => "\xc7\x92",  "\xc7\x93" => "\xc7\x94",
+    "\xc7\x95" => "\xc7\x96",  "\xc7\x97" => "\xc7\x98",
+    "\xc7\x99" => "\xc7\x9a",  "\xc7\x9b" => "\xc7\x9c",
+    "\xc7\x9e" => "\xc7\x9f",  "\xc7\xa0" => "\xc7\xa1",
+    "\xc7\xa2" => "\xc7\xa3",  "\xc7\xa4" => "\xc7\xa5",
+    "\xc7\xa6" => "\xc7\xa7",  "\xc7\xa8" => "\xc7\xa9",
+    "\xc7\xaa" => "\xc7\xab",  "\xc7\xac" => "\xc7\xad",
+    "\xc7\xae" => "\xc7\xaf",  "\xc7\xb0" => "j\xcc\x8c",
+    "\xc7\xb1" => "\xc7\xb3",  "\xc7\xb2" => "\xc7\xb3",
+    "\xc7\xb4" => "\xc7\xb5",  "\xc7\xb6" => "\xc6\x95",
+    "\xc7\xb7" => "\xc6\xbf",  "\xc7\xb8" => "\xc7\xb9",
+    "\xc7\xba" => "\xc7\xbb",  "\xc7\xbc" => "\xc7\xbd",
+    "\xc7\xbe" => "\xc7\xbf",
+    ##   U+0200
+    "\xc8\x80" => "\xc8\x81",  "\xc8\x82" => "\xc8\x83",
+    "\xc8\x84" => "\xc8\x85",  "\xc8\x86" => "\xc8\x87",
+    "\xc8\x88" => "\xc8\x89",  "\xc8\x8a" => "\xc8\x8b",
+    "\xc8\x8c" => "\xc8\x8d",  "\xc8\x8e" => "\xc8\x8f",
+    "\xc8\x90" => "\xc8\x91",  "\xc8\x92" => "\xc8\x93",
+    "\xc8\x94" => "\xc8\x95",  "\xc8\x96" => "\xc8\x97",
+    "\xc8\x98" => "\xc8\x99",  "\xc8\x9a" => "\xc8\x9b",
+    "\xc8\x9c" => "\xc8\x9d",  "\xc8\x9e" => "\xc8\x9f",
+    "\xc8\xa0" => "\xc6\x9e",  "\xc8\xa2" => "\xc8\xa3",
+    "\xc8\xa4" => "\xc8\xa5",  "\xc8\xa6" => "\xc8\xa7",
+    "\xc8\xa8" => "\xc8\xa9",  "\xc8\xaa" => "\xc8\xab",
+    "\xc8\xac" => "\xc8\xad",  "\xc8\xae" => "\xc8\xaf",
+    "\xc8\xb0" => "\xc8\xb1",  "\xc8\xb2" => "\xc8\xb3",
+    "\xc8\xba" => "\xe2\xb1\xa5",  "\xc8\xbb" => "\xc8\xbc",
+    "\xc8\xbd" => "\xc6\x9a",  "\xc8\xbe" => "\xe2\xb1\xa6",
+    ##   U+0240
+    "\xc9\x81" => "\xc9\x82",  "\xc9\x83" => "\xc6\x80",
+    "\xc9\x84" => "\xca\x89",  "\xc9\x85" => "\xca\x8c",
+    "\xc9\x86" => "\xc9\x87",  "\xc9\x88" => "\xc9\x89",
+    "\xc9\x8a" => "\xc9\x8b",  "\xc9\x8c" => "\xc9\x8d",
+    "\xc9\x8e" => "\xc9\x8f",
+    ##   U+0345
+    "\xcd\x85" => "\xce\xb9",
+    ##   U+0380
+    "\xce\x86" => "\xce\xac",  "\xce\x88" => "\xce\xad",
+    "\xce\x89" => "\xce\xae",  "\xce\x8a" => "\xce\xaf",
+    "\xce\x8c" => "\xcf\x8c",  "\xce\x8e" => "\xcf\x8d",
+    "\xce\x8f" => "\xcf\x8e",  "\xce\x90" => "\xce\xb9\xcc\x88\xcc\x81",
+    "\xce\x91" => "\xce\xb1",  "\xce\x92" => "\xce\xb2",
+    "\xce\x93" => "\xce\xb3",  "\xce\x94" => "\xce\xb4",
+    "\xce\x95" => "\xce\xb5",  "\xce\x96" => "\xce\xb6",
+    "\xce\x97" => "\xce\xb7",  "\xce\x98" => "\xce\xb8",
+    "\xce\x99" => "\xce\xb9",  "\xce\x9a" => "\xce\xba",
+    "\xce\x9b" => "\xce\xbb",  "\xce\x9c" => "\xce\xbc",
+    "\xce\x9d" => "\xce\xbd",  "\xce\x9e" => "\xce\xbe",
+    "\xce\x9f" => "\xce\xbf",  "\xce\xa0" => "\xcf\x80",
+    "\xce\xa1" => "\xcf\x81",  "\xce\xa3" => "\xcf\x83",
+    "\xce\xa4" => "\xcf\x84",  "\xce\xa5" => "\xcf\x85",
+    "\xce\xa6" => "\xcf\x86",  "\xce\xa7" => "\xcf\x87",
+    "\xce\xa8" => "\xcf\x88",  "\xce\xa9" => "\xcf\x89",
+    "\xce\xaa" => "\xcf\x8a",  "\xce\xab" => "\xcf\x8b",
+    "\xce\xb0" => "\xcf\x85\xcc\x88\xcc\x81",
+    ##   U+03c0
+    "\xcf\x82" => "\xcf\x83",  "\xcf\x90" => "\xce\xb2",
+    "\xcf\x91" => "\xce\xb8",  "\xcf\x95" => "\xcf\x86",
+    "\xcf\x96" => "\xcf\x80",  "\xcf\x98" => "\xcf\x99",
+    "\xcf\x9a" => "\xcf\x9b",  "\xcf\x9c" => "\xcf\x9d",
+    "\xcf\x9e" => "\xcf\x9f",  "\xcf\xa0" => "\xcf\xa1",
+    "\xcf\xa2" => "\xcf\xa3",  "\xcf\xa4" => "\xcf\xa5",
+    "\xcf\xa6" => "\xcf\xa7",  "\xcf\xa8" => "\xcf\xa9",
+    "\xcf\xaa" => "\xcf\xab",  "\xcf\xac" => "\xcf\xad",
+    "\xcf\xae" => "\xcf\xaf",  "\xcf\xb0" => "\xce\xba",
+    "\xcf\xb1" => "\xcf\x81",  "\xcf\xb4" => "\xce\xb8",
+    "\xcf\xb5" => "\xce\xb5",  "\xcf\xb7" => "\xcf\xb8",
+    "\xcf\xb9" => "\xcf\xb2",  "\xcf\xba" => "\xcf\xbb",
+    "\xcf\xbd" => "\xcd\xbb",  "\xcf\xbe" => "\xcd\xbc",
+    "\xcf\xbf" => "\xcd\xbd",
+    ##   U+0400
+    "\xd0\x80" => "\xd1\x90",  "\xd0\x81" => "\xd1\x91",
+    "\xd0\x82" => "\xd1\x92",  "\xd0\x83" => "\xd1\x93",
+    "\xd0\x84" => "\xd1\x94",  "\xd0\x85" => "\xd1\x95",
+    "\xd0\x86" => "\xd1\x96",  "\xd0\x87" => "\xd1\x97",
+    "\xd0\x88" => "\xd1\x98",  "\xd0\x89" => "\xd1\x99",
+    "\xd0\x8a" => "\xd1\x9a",  "\xd0\x8b" => "\xd1\x9b",
+    "\xd0\x8c" => "\xd1\x9c",  "\xd0\x8d" => "\xd1\x9d",
+    "\xd0\x8e" => "\xd1\x9e",  "\xd0\x8f" => "\xd1\x9f",
+    "\xd0\x90" => "\xd0\xb0",  "\xd0\x91" => "\xd0\xb1",
+    "\xd0\x92" => "\xd0\xb2",  "\xd0\x93" => "\xd0\xb3",
+    "\xd0\x94" => "\xd0\xb4",  "\xd0\x95" => "\xd0\xb5",
+    "\xd0\x96" => "\xd0\xb6",  "\xd0\x97" => "\xd0\xb7",
+    "\xd0\x98" => "\xd0\xb8",  "\xd0\x99" => "\xd0\xb9",
+    "\xd0\x9a" => "\xd0\xba",  "\xd0\x9b" => "\xd0\xbb",
+    "\xd0\x9c" => "\xd0\xbc",  "\xd0\x9d" => "\xd0\xbd",
+    "\xd0\x9e" => "\xd0\xbe",  "\xd0\x9f" => "\xd0\xbf",
+    "\xd0\xa0" => "\xd1\x80",  "\xd0\xa1" => "\xd1\x81",
+    "\xd0\xa2" => "\xd1\x82",  "\xd0\xa3" => "\xd1\x83",
+    "\xd0\xa4" => "\xd1\x84",  "\xd0\xa5" => "\xd1\x85",
+    "\xd0\xa6" => "\xd1\x86",  "\xd0\xa7" => "\xd1\x87",
+    "\xd0\xa8" => "\xd1\x88",  "\xd0\xa9" => "\xd1\x89",
+    "\xd0\xaa" => "\xd1\x8a",  "\xd0\xab" => "\xd1\x8b",
+    "\xd0\xac" => "\xd1\x8c",  "\xd0\xad" => "\xd1\x8d",
+    "\xd0\xae" => "\xd1\x8e",  "\xd0\xaf" => "\xd1\x8f",
+    ##   U+0460
+    "\xd1\xa0" => "\xd1\xa1",  "\xd1\xa2" => "\xd1\xa3",
+    "\xd1\xa4" => "\xd1\xa5",  "\xd1\xa6" => "\xd1\xa7",
+    "\xd1\xa8" => "\xd1\xa9",  "\xd1\xaa" => "\xd1\xab",
+    "\xd1\xac" => "\xd1\xad",  "\xd1\xae" => "\xd1\xaf",
+    "\xd1\xb0" => "\xd1\xb1",  "\xd1\xb2" => "\xd1\xb3",
+    "\xd1\xb4" => "\xd1\xb5",  "\xd1\xb6" => "\xd1\xb7",
+    "\xd1\xb8" => "\xd1\xb9",  "\xd1\xba" => "\xd1\xbb",
+    "\xd1\xbc" => "\xd1\xbd",  "\xd1\xbe" => "\xd1\xbf",
+    ##   U+0480
+    "\xd2\x80" => "\xd2\x81",  "\xd2\x8a" => "\xd2\x8b",
+    "\xd2\x8c" => "\xd2\x8d",  "\xd2\x8e" => "\xd2\x8f",
+    "\xd2\x90" => "\xd2\x91",  "\xd2\x92" => "\xd2\x93",
+    "\xd2\x94" => "\xd2\x95",  "\xd2\x96" => "\xd2\x97",
+    "\xd2\x98" => "\xd2\x99",  "\xd2\x9a" => "\xd2\x9b",
+    "\xd2\x9c" => "\xd2\x9d",  "\xd2\x9e" => "\xd2\x9f",
+    "\xd2\xa0" => "\xd2\xa1",  "\xd2\xa2" => "\xd2\xa3",
+    "\xd2\xa4" => "\xd2\xa5",  "\xd2\xa6" => "\xd2\xa7",
+    "\xd2\xa8" => "\xd2\xa9",  "\xd2\xaa" => "\xd2\xab",
+    "\xd2\xac" => "\xd2\xad",  "\xd2\xae" => "\xd2\xaf",
+    "\xd2\xb0" => "\xd2\xb1",  "\xd2\xb2" => "\xd2\xb3",
+    "\xd2\xb4" => "\xd2\xb5",  "\xd2\xb6" => "\xd2\xb7",
+    "\xd2\xb8" => "\xd2\xb9",  "\xd2\xba" => "\xd2\xbb",
+    "\xd2\xbc" => "\xd2\xbd",  "\xd2\xbe" => "\xd2\xbf",
+    ##   U+04c0
+    "\xd3\x80" => "\xd3\x8f",  "\xd3\x81" => "\xd3\x82",
+    "\xd3\x83" => "\xd3\x84",  "\xd3\x85" => "\xd3\x86",
+    "\xd3\x87" => "\xd3\x88",  "\xd3\x89" => "\xd3\x8a",
+    "\xd3\x8b" => "\xd3\x8c",  "\xd3\x8d" => "\xd3\x8e",
+    "\xd3\x90" => "\xd3\x91",  "\xd3\x92" => "\xd3\x93",
+    "\xd3\x94" => "\xd3\x95",  "\xd3\x96" => "\xd3\x97",
+    "\xd3\x98" => "\xd3\x99",  "\xd3\x9a" => "\xd3\x9b",
+    "\xd3\x9c" => "\xd3\x9d",  "\xd3\x9e" => "\xd3\x9f",
+    "\xd3\xa0" => "\xd3\xa1",  "\xd3\xa2" => "\xd3\xa3",
+    "\xd3\xa4" => "\xd3\xa5",  "\xd3\xa6" => "\xd3\xa7",
+    "\xd3\xa8" => "\xd3\xa9",  "\xd3\xaa" => "\xd3\xab",
+    "\xd3\xac" => "\xd3\xad",  "\xd3\xae" => "\xd3\xaf",
+    "\xd3\xb0" => "\xd3\xb1",  "\xd3\xb2" => "\xd3\xb3",
+    "\xd3\xb4" => "\xd3\xb5",  "\xd3\xb6" => "\xd3\xb7",
+    "\xd3\xb8" => "\xd3\xb9",  "\xd3\xba" => "\xd3\xbb",
+    "\xd3\xbc" => "\xd3\xbd",  "\xd3\xbe" => "\xd3\xbf",
+    ##   U+0500
+    "\xd4\x80" => "\xd4\x81",  "\xd4\x82" => "\xd4\x83",
+    "\xd4\x84" => "\xd4\x85",  "\xd4\x86" => "\xd4\x87",
+    "\xd4\x88" => "\xd4\x89",  "\xd4\x8a" => "\xd4\x8b",
+    "\xd4\x8c" => "\xd4\x8d",  "\xd4\x8e" => "\xd4\x8f",
+    "\xd4\x90" => "\xd4\x91",  "\xd4\x92" => "\xd4\x93",
+    "\xd4\xb1" => "\xd5\xa1",  "\xd4\xb2" => "\xd5\xa2",
+    "\xd4\xb3" => "\xd5\xa3",  "\xd4\xb4" => "\xd5\xa4",
+    "\xd4\xb5" => "\xd5\xa5",  "\xd4\xb6" => "\xd5\xa6",
+    "\xd4\xb7" => "\xd5\xa7",  "\xd4\xb8" => "\xd5\xa8",
+    "\xd4\xb9" => "\xd5\xa9",  "\xd4\xba" => "\xd5\xaa",
+    "\xd4\xbb" => "\xd5\xab",  "\xd4\xbc" => "\xd5\xac",
+    "\xd4\xbd" => "\xd5\xad",  "\xd4\xbe" => "\xd5\xae",
+    "\xd4\xbf" => "\xd5\xaf",
+    ##   U+0540
+    "\xd5\x80" => "\xd5\xb0",  "\xd5\x81" => "\xd5\xb1",
+    "\xd5\x82" => "\xd5\xb2",  "\xd5\x83" => "\xd5\xb3",
+    "\xd5\x84" => "\xd5\xb4",  "\xd5\x85" => "\xd5\xb5",
+    "\xd5\x86" => "\xd5\xb6",  "\xd5\x87" => "\xd5\xb7",
+    "\xd5\x88" => "\xd5\xb8",  "\xd5\x89" => "\xd5\xb9",
+    "\xd5\x8a" => "\xd5\xba",  "\xd5\x8b" => "\xd5\xbb",
+    "\xd5\x8c" => "\xd5\xbc",  "\xd5\x8d" => "\xd5\xbd",
+    "\xd5\x8e" => "\xd5\xbe",  "\xd5\x8f" => "\xd5\xbf",
+    "\xd5\x90" => "\xd6\x80",  "\xd5\x91" => "\xd6\x81",
+    "\xd5\x92" => "\xd6\x82",  "\xd5\x93" => "\xd6\x83",
+    "\xd5\x94" => "\xd6\x84",  "\xd5\x95" => "\xd6\x85",
+    "\xd5\x96" => "\xd6\x86",  "\xd6\x87" => "\xd5\xa5\xd6\x82"
+  ));  
+
+

Deleted: trunk/oggdsf/website/sse_builds.html
===================================================================
--- trunk/oggdsf/website/sse_builds.html	2008-04-26 10:03:23 UTC (rev 14802)
+++ trunk/oggdsf/website/sse_builds.html	2008-04-28 00:13:04 UTC (rev 14803)
@@ -1,76 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-  <title>illiminable Ogg Directshow Filters for Speex, Vorbis, Theora and FLAC</title>
-  <meta name="description" content="Directshow Ogg demuxer/muxer with vorbis, speex, FLAC and theora decoders and encoders.">
-  <meta name="keywords" content="directshow, theora, vorbis, speex, ogg, media player, flac, codec, windows, audio, video, wmp, directX, plugin, plug-in, decoder, encoder, demux, mux, demuxer">
-</head>
-<a href="http://www.illiminable.com/ogg">Main Page</a><br>
-<br>
-<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#FF00FF" alink="#FF0000">
-<b><u><font size="+2">SSE/SSE2 Experimental Builds of Directshow Filters for Ogg Vorbis, Speex, Theora and FLAC</font></u></b><br>
-<br>
-These are experimental builds only... if you have any doubt about whether your processor supports these, download the official release from the <a href="http://www.illiminable.com/ogg">main page</a><br>
-<br>
-These builds are specific to SSE and SSE2 compatable processors. If you run these on the wrong processor they will crash the program and maybe even your system. If in doubt don't use them !<br>
-<br>
-SSE2 instructions are for Pentium 4's. SSE instructions are for some Pentium 3's and Athlon XP's. None of the old athlons support them. Also note, I only have Athlons, so I haven't tested the SSE2 builds at all. If you use these and they work, I'd appreciate if you let me know. 
-I have found about a 15% improvement in encode speed using the SSE builds on my machine. If you do some testing on your machine let me know. Uninstall the normal/previous version before installing these.<br>
-<br>
-<br>
-<b><u>Current Version 0.68.8333 - 06/12/2004</u></b><br>
-See the <a href="http://www.illiminable.com/ogg">Main Page</a> for the release notes and issues for this version.<br><br>
-<FONT size=2 color="#000000" face="Arial">
-<DIV><TABLE width=100% bgcolor="#FFFFFF" border=1 cellpadding=2 cellspacing=2>
-<TR valign=top>
-
-	<TD width=40%><FONT size=2 color="#000000" face="Arial">
-		<DIV>Ogg Codecs for windows</DIV>
-		</FONT>
-	</TD>
-	<TD width=20%><FONT size=2 color="#000000" face="Arial">
-		<DIV>SSE Enabled Processors <b>ONLY</b></DIV>
-		</FONT>
-	</TD>
-
-
-	<TD width=20%><FONT size=2 color="#000000" face="Arial">
-		<DIV><div align="right">992,504 bytes</div></DIV></FONT>
-	</TD>
-
-	<TD width=20%><FONT size=2 color="#000000" face="Arial">
-		<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_SSE_0.68.8333.zip">Download Now</a></div></DIV></FONT>
-	</TD>
-
-</TR>
-
-<TR valign=top>
-
-	<TD width=40%><FONT size=2 color="#000000" face="Arial">
-		<DIV>Ogg Codecs for windows</DIV>
-		</FONT>
-	</TD>
-	<TD width=20%><FONT size=2 color="#000000" face="Arial">
-		<DIV>SSE2 Enabled Processors <b>ONLY</b></DIV>
-		</FONT>
-	</TD>
-
-
-	<TD width=20%><FONT size=2 color="#000000" face="Arial">
-		<DIV><div align="right">985,275 bytes</div></DIV></FONT>
-	</TD>
-
-	<TD width=20%><FONT size=2 color="#000000" face="Arial">
-		<DIV><div align="right"><a href="http://www.illiminable.com/ogg/oggcodecs_SSE2_0.68.8333.zip">Download Now</a></div></DIV></FONT>
-	</TD>
-
-</TR>
-
-</TABLE>
-</DIV>
-</FONT>
-<br>
-<a href="http://www.illiminable.com/ogg">Main Page</a><br>
-</body>
-</html>
-

Added: trunk/oggdsf/website/uploads/Main/oggcodecs_0.69.8924.exe
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/Main/oggcodecs_0.69.8924.exe
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/Main/oggcodecs_0.70.0827.exe
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/Main/oggcodecs_0.70.0827.exe
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/Main/oggcodecs_0.71.0946.exe
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/Main/oggcodecs_0.71.0946.exe
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/Main/oggcodecs_0.72.1838.exe
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/Main/oggcodecs_0.72.1838.exe
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/Main/oggcodecs_0.73.1936.exe
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/Main/oggcodecs_0.73.1936.exe
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/Main/oggcodecs_SSE2_0.68.8333.zip
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/Main/oggcodecs_SSE2_0.68.8333.zip
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/Main/oggcodecs_SSE_0.68.8333.zip
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/Main/oggcodecs_SSE_0.68.8333.zip
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/Main/oggcodecs_src_0.70.0827.zip
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/Main/oggcodecs_src_0.70.0827.zip
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/docs/index.html
===================================================================
--- trunk/oggdsf/website/uploads/docs/index.html	                        (rev 0)
+++ trunk/oggdsf/website/uploads/docs/index.html	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1 @@
+This is where the API documentation should go.

Added: trunk/oggdsf/website/uploads/images/connect_encoders.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/connect_encoders.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/divx+vorbis_decode.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/divx+vorbis_decode.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/encoders_added.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/encoders_added.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/ensure_YV12.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/ensure_YV12.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/filter_properties.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/filter_properties.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/find_encoders.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/find_encoders.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/fully_connected.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/fully_connected.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/mixmux.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/mixmux.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/mp3_to_speex_graphedit.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/mp3_to_speex_graphedit.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/mp3_to_vorbis_graphedit.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/mp3_to_vorbis_graphedit.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/ogg_split_graphedit.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/ogg_split_graphedit.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/pin_properties.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/pin_properties.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/press_play.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/press_play.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/remove_renderers.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/remove_renderers.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/select_encoders.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/select_encoders.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/select_muxer.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/select_muxer.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/select_output_file.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/select_output_file.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/select_render_file.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/select_render_file.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/show_rendered_graph.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/show_rendered_graph.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/theora_properties.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/theora_properties.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/vorbis_to_mp3_graphedit.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/vorbis_to_mp3_graphedit.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/wave_to_vorbis_graphedit.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/wave_to_vorbis_graphedit.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/oggdsf/website/uploads/images/wma_to_vorbis_graphedit.JPG
===================================================================
(Binary files differ)


Property changes on: trunk/oggdsf/website/uploads/images/wma_to_vorbis_graphedit.JPG
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Deleted: trunk/oggdsf/website/version_check.php
===================================================================
--- trunk/oggdsf/website/version_check.php	2008-04-26 10:03:23 UTC (rev 14802)
+++ trunk/oggdsf/website/version_check.php	2008-04-28 00:13:04 UTC (rev 14803)
@@ -1,28 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-  <title>oggcodecs Version Check</title>
-  <meta name="description" content="Directshow Ogg demuxer/muxer with vorbis, speex, FLAC and theora decoders and encoders.">
-  <meta name="keywords" content="directshow, theora, vorbis, speex, ogg, media player, flac, codec, windows, audio, video, wmp, directX, plugin, plug-in, decoder, encoder, demux, mux, demuxer">
-</head>
-
-<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#DD0000" alink="#FF0000">
-<?php
-   $x=$_GET['version'];
-   $v='0.71.0946';
-
-   if (strcmp($x, '') == 0) {
-	echo 'Invalid request';
-   } else {
-    
-     if (strcmp($v, $x) > 0) {
-	  echo 'New version ', $v, ' is available';
-     } else {
-          echo 'No new version available. Current version is ', $v;
-     }
-   }
-?>
-	
-
-</body>
-</html>
\ No newline at end of file

Added: trunk/oggdsf/website/wiki.d/.flock
===================================================================

Added: trunk/oggdsf/website/wiki.d/.htaccess
===================================================================
--- trunk/oggdsf/website/wiki.d/.htaccess	                        (rev 0)
+++ trunk/oggdsf/website/wiki.d/.htaccess	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,2 @@
+Order Deny,Allow
+Deny from all

Added: trunk/oggdsf/website/wiki.d/.lastmod
===================================================================

Added: trunk/oggdsf/website/wiki.d/.pageindex
===================================================================
--- trunk/oggdsf/website/wiki.d/.pageindex	                        (rev 0)
+++ trunk/oggdsf/website/wiki.d/.pageindex	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,43 @@
+Main.History:1209340846: Main.Downloads Main.History Main.About : implementation encapsulation possibilities documentation programmitic programmatic applications architecture consistency maintenance limitations oggcodecs_0 opportunity integrating interesting sourceforge intelligent multimedia experience directshow technology continuous management subversion repository particular maintained frequently extensible especially interface footprint knowledge hopefully downloads keyframes artefacts localhost associate australia seektable available installer filenames releasing otherwise libraries streaming solutions correctly community encourage extension bitstream versions kavanagh original improved releases properly problems previous approach encoders physical progress encoding standard included possible decoders pfeiffer sparking internet renaming increase contract cristian exciting complete consider specific handling continue accurate thankyou presents requests default dynamic p
 rovide scratch decided several removed between uploads modules windows project support rewrite setting reduces utilise quality annodex demuxer attempt another generic trouble writing chained without seeking filters changes players initial unicode feature putting through working soonish written updated history started rectify messing servers bufixes notable icecast because handles streams forever waiting oggdsf vorbis attach silvia builds easier little longer really static sample parker memory conrad fairly should buffer always coming theora sizing single search second expand within better slight richer design gained handed muxing binary create format needed making rather whilst basing there began andre still which again under group audio about being order csiro works first found leaks based email major trunk these along fixed bytes older added sorry range alive april while files click aware 250mb tools thing large great taken avoid wrote might whole perth speex check were th
 is page back just that docs much hack will http does open want 2008 what have adam most from disk over keep bugs more uses your 0827 8924 even lots 2005 xiph been come wmp6 2006 2004 then only pang fold case some aims year less many ogm www sdk new off zen two may has got but 1st was why wow can yes exe one get 816 782 581 824 non try svn 10 69 02 15 70 my 95
+Main.WikiSandbox:1209340622:  : wikisandbox formatting experiment pmwiki bottom click rules link page main free just edit feel text this with use the of
+PmWiki.BasicVariables:1209340622: PmWiki.Variables PmWiki.WikiGroup Site.Search Site.EditForm Site.PageNotFound PmWiki.WikiWord PmWiki.PerGroupCustomizations PmWiki.LocalCustomizations PmWiki.AuthUser PmWiki.MarkupExpressions PmWiki.WikiFarms : pergroupcustomizations authoringphilosophy localcustomizations enablelocalconfig logoutredirectfmt markupexpressions asspacedfunction nospacewikiwords limitwikigroups nolinkwikiwords enablewikiwords wikiwordpattern enableredirect specifications basicvariables configuration automatically logoutcookies authorization grouppattern pagenotfound cookieprefix enablepgcust redirections defaultgroup alphanumeric applications preformatted representing enablewspre defaultpage namepattern authorgroup underscores defaultname potentially versionnum myasspaced processing characters farmconfig components directives discussion identifies indicates isolating following beginning treatment according describes september uppercase different prepended remai
 ning sequences conflicts sitegroup redirects performed specified sometimes debugging wikifarms strftime ftimefmt editform affected releases defaults normally override allowing disables authuser cookbook followed homepage profiles __file__ sections separate required multiple leading regular strings message instead results recipes summary treated setting spacing pmwiki_ 2001040 greater browser startup actions current mygroup configs usually minimum produce hyphens prevent convert invoked enables 2001902 2002000 visitor similar removed utility 2001918 storing 2001000 enabled 2001027 scripts 2001901 without 2001001 number padded target loaded zeroes letter digits authid causes unique tracks reader domain before search substr useful beta18 should spaces linked called allows dates value pages occur pause doesn which based beta2 using sites users login gives issue minor first field three store wikis lines major other array names links after avoid named being valid 2005 same that wh
 en then used than text last such this note also bare from rule turn each into have http next will but can any php md5 and you see off net who etc url 900 999 tmp by 09 57 08
+PmWiki.DebugVariables:1209340622: PmWiki.Variables : availableactions enableimscaching enablestopwatch debugvariables begenablediag endenablediag administrator recognizes generated displayed activates permanent reloading debugging customize template disabled internal refcount function browsers multiple separate modified composes timings scripts subpage needing windows default without locally include sidebar header allows adding pmwiki normal render layout coming cached values useful which total pages clock equal valid takes usage shows since will wall html each only also have long that this when from help such work the its for set won get and are see can cpu php as by 1 0 2
+PmWiki.EditVariables:1209340622: PmWiki.Variables : enablepostauthorrequired defaultpagetextfmt postrecentchanges edittemplatesfmt enableguibuttons deletekeypattern handlebrowsefmt editredirectfmt newpagetemplate saveattributes replaceonsave handleeditfmt editfunctions customization editvariables enabledrafts pagenotfound diffkeepdays pageeditform ispageposted pageeditfmt rospatterns previewpage restorepage draftsuffix subsequent additional customized selections revisions graphical displayed sitegroup determine otherwise specified specifies something homepage browsing pagename versions existent postpage contents possible pressing defaults actually cookbook fullname examples handlers sequence requires specific existing contains attempts standard handling optional enables elapsed removed process visible smaller created history current minimum authors setting provide specify initial changed include without deleted editing posting another action format entire output edited shoul
 d spaces single update called causes pmwiki little saving length cancel exists array names saved still value empty those older which pages newly edits sends years after built turns saves where least until first part when tell main this used sets time from html next such just than that will have need they give 3650 only thus file word less like note sent true kept are you has see any isn non be by of 30 1 4 2
+PmWiki.FilePermissions:1209340622: PmWiki.PmWiki : filepermissions subdirectories administrator installations configuration temporarily appropriate environment public_html responsible encountered webservers drwxrwxrwx distribute ownerships accessible definitive configured everything referenced directory prompting situation safe_mode questions somewhere available generally hierarchy typically different pubdirurl beginning depending describes alternate according cookbook whatever granting pmichaud creation attempts settings outlined writable complain creating absolute drwxrwsr function manually specific anything browsers directly normally detailed identity solution account section creates uploads created someone mimetex execute details shouldn without groupid scripts running because briefly however depends systems example calling letting ensures applies pmwiki holder having setgid apache cannot around itself parent virtue within change belong action needed select things people
  placed simply frobot cached markup images mkdirp recipe answer modify userid manner matter solves loaded owned which since below files doesn write those needs again chmod users world other allow there wants 54272 would still rules apply doing issue httpd works order pages means about above exact basic first their based also this 1024 them have that then will take care just same disk such like used uses upon thus case when runs math make look owns only site each okay into from save home most they unix must host else lots read why and css pwd 777 feb for php two ask now www isn via has way was get bit don jan 755 who by of go 95 58 11 23 51 15 29 12
+PmWiki.FmtPageName:1209340622: PmWiki.Functions PmWiki.Variables PmWiki.Internationalizations : internationalizations internationalisation internationalized lastmodifiedhost asspacedfunction lastmodifiedby enablepathinfo substitutions automatically corresponding unsafeglobals preg_replace substituting array_values replacements grouppattern alphabetical fmtpagename translation centralizes str_replace substitions corresponds groupspaced namepattern titlespaced performing converting array_keys referenced formatting frequently myvariable rebuilding generating substitute preg_match attributes assumption incomplete subroutine namespaced different regarding scripturl variables currently sequences expensive modifying typically instances displayed something path_info extremely arbitrary functions available is_object basically describes performed probably readpage continue specific audience normally intended is_array cookbook repeated in_array multiple defining argument relative stand
 ard internal contents performs fullname advanced explains whatever anything version handles dynamic produce returns variety related strings finally follows process however caching browser limited happens reverse phrases instead applies because pageurl through special somehow foreach trusted pcache loaded strpos pmwiki gcount change source cached become cannot obtain viewed moment simple beta55 xyzfmt needed things tables output engine exists krsort better called arrays static syntax admins under other taken below sites while often based needs false avoid these wrote items order along reset using being isset doing those aware since calls going given heart means fmtv done that with this like weak must they note hold have very uris over only than also just list next same will been work aren here urls from code goes else ways used when pvar such into pue etc pss was get see php why may its has isn xl 1 0 2
+PmWiki.GroupHeader:1209340622:  : concatenated groupheader definitions linebreaks configured important audience multiple bgcolor padding enabled comment smaller single define rfloat please italic ffffcc appear output border pmwiki thanks trail block leave style class green black frame solid font when note with size 5px the 1px eee do is
+PmWiki.OtherVariables:1209340622: PmWiki.Variables PmWiki.FmtPageName PmWiki.PageVariables : pageattributes othervariables substitutions corresponding pagevariables passwdsource fmtpagename interpreted frequently definition beginning evaluated replaced avoiding intended changing password instance current example rebuild pattern defined varname element action handle string markup passed pmwiki values depend fmtpv array store which cache this that used each with fmtv will call also near have thus see for can key new set of by
+PmWiki.PagelistVariables:1209340622: PmWiki.Variables : enablepagelistprotect fpltemplatepagefmt pagelisttemplates pagelistvariables enablepageindex searchpatterns pagesearchform localtemplates authorization pageindexfile searchresults recentchanges significantly considerably exclamation permissions customized categories backlinks delimited protected directive specified searching parameter sitegroup otherwise currently searches location defaults required cookbook searched included maintain excluded listing because browser workdir setting checked exists pmwiki appear format points unless causes action speeds array match means which first order found from that read does look when well have this case used zero need name must word also all and but xyz not any has see of by 1
+PmWiki.PathVariables:1209340622: PmWiki.Variables PmWiki.LocalCustomizations PmWiki.PerGroupCustomization PmWiki.WikiFarms PmWiki.LayoutVariables PmWiki.LinkVariables PmWiki.EditVariables PmWiki.UploadVariables : pergroupcustomization localcustomizations uploadvariables layoutvariables subdirectories configurations pagecsslistfmt editvariables farmpubdirurl corresponding administrator manipulations pathvariables linkvariables automatically coresponding distribution subdirectory modification associative sharedpages mod_rewrite wikilibdirs attachments distinguish instructed farmconfig containing filesystem determined explicitly connecting associated skindirurl regardless accessible difference statements sometimes pagestore scripturl something typically reference webserver cleanurls mailposts currently temporary wikifarms recognize prominent available described accessing fullname cookbook features simplify defaults consists generate guessing directly whenever building browsers 
 localdir advanced location contains requires possible keeping confuse provide graphic entries workdir version variety caching scripts wikidir holding backend bizarre exclude running uploads editing usually include example setting located objects options execute getting display control another certain bundled working because changed between correct dealing specify pmwiki either reason engine inside create things merged people beta26 images string always fairly action within having search refers entire places merely simple stored exists tested array needs field gives farmd skins these lines about value mysql where below pairs while which links paths occur edits track named cache types makes used last note want good site that this also such them both base more tmpl look copy wish http data disk turn keys from they uses same your find runs each into must html most thus tell for any and dbm how see php www com one has via can may add own etc of by do 1
+PmWiki.PatrickMichaud:1209340622:  : patrickmichaud information pmichaud pmwiki author found about more http com the him can www is be of
+PmWiki.PmWiki:1209340622: PmWiki.WikiWikiWeb Main.WikiSandbox PmWiki.BasicEditing PmWiki.Skins PmWiki.PmWikiPhilosophy PmWiki.Installation : pmwikiphilosophy administrators customization collaborative basicediting architecture installation applications wikiwikiweb conjunction wikisandbox distributed appropriate maintenance attachments extensions registered restricted completely protection individual appearance available customize templates different functions databases contained principle essential trademark websites creation features controls existing password hundreds maintain cookbook copyleft pmichaud designed htaccess patrick license quickly already applied authors servers written recipes general version running include variety groups entire create modify easily public newwin simple markup plugin engine system called upload action normal change except skins based pages under using mysql small rules makes link ldap such easy that with only html into from know need http o
 pen work core your they look home also like this find feel made have self org are for www gnu gpl not php net add any can key one who own css use of by be do
+PmWiki.Security:1209340622: PmWiki.Passwords PmWiki.PasswordsAdmin PmWiki.UrlApprovals : webserversecurity register_globals passwordsadmin administrator configuration installations vulnerability siteanalyzer urlapprovals farmsecurity mtblacklist distributed auditimages vulnerable blocklist2 analyzing determine upgrading advantage cookbook postings htaccess eprotect versions uploaded advisory settings addition storyid address require running exploit options movable turning content general pmwiki botnet taking closed secure making pages about sites links diary based index later there check prior that 1672 test used with your have type been more spam what hide mail also http tool sans for and bug see can php may are org isc faq off if 21 ip by 4 3 5
+PmWiki.SitePreferences:1209340622: Site.Preferences PmWiki.AccessKeys Site.EditForm : custompreferences sitepreferences customisable customising accesskeys customised somegroup sitegroup following shortcuts different editform textarea contains setprefs settings comments keyboard parsing through browser choosen actions include certain history config xlpage height enable pmwiki making cookie local added which being notes about order width point needs these under that well like name used than copy will this line php and can new as of by
+PmWiki.UploadVariables:1209340622: PmWiki.Variables PmWiki.UploadsAdmin Profiles.Jb : enabledirectdownload enableuploadversions linkuploadcreatefmt uploadprefixquota uploadnamechars uploadprefixfmt uploadvariables createlinktext uploaddirquota 1000000000000 uploadmaxsize alphanumerics configuration automatically uploadurlfmt uploadsadmin exclamations imaplinkfmt attachments underscores overwritten permissions everything characters organized directory uploading displayed webserver timestamp increases stdconfig location defaults question stripped requests uploaded fullname sitewide obtained directly password profiles included writable already protect present setting bittner maximum overall process instead allowed hyphens renamed pmwiki stored octets equals script spaces values causes groups bypass action allows before exists format above being bytes style delta limit where links still class units users other 50000 given local names occur using which means must when also need p
 age from unix plus true dots used will else what this note that same john href sets nbsp come 100k than can and but are php any 1mb may one via 1tb 1gb see old jb if
+PmWiki.WikiGroups:1209340622:  : wikigroups redirect pmwiki
+PmWiki.WikiSandbox:1209340622:  : wikisandbox redirect pmwiki main
+PmWiki.WikiWords:1209340622:  : wikiwords redirect pmwiki
+Site.AuthForm:1209340622:  : enableauthuser invalidlogin recognized auth_form password required authform messages enabled authid authpw submit input value site name text not end if ok
+Site.AuthUser:1209340622:  : siteadmin authuser redirect
+Site.EditForm:1209340622:  : editquickreference e_savedraftbutton e_saveeditbutton e_previewbutton e_minorcheckbox e_changesummary e_cancelbutton e_savebutton e_guibuttons e_textarea wikiaction sitegroup editform messages e_author fullname wikiedit remember editing include unsaved e_form divend input block class page this top if of id
+Site.GroupAttributes:1209340622:  : groupattributes site
+Site.PageActions:1209340622: Site.PageActions : pageactions ak_history ak_attach accesskey fullname nofollow ak_print ak_edit ak_view upload browse class item site diff auth rel
+Site.PageListTemplates:1209340622: Site.LocalTemplates PmWiki.PageLists PmWiki.PageVariables PmWiki.PageTextVariables PmWiki.ConditionalMarkup : pagelisttemplatesamples simplenamespacedend pagetextvariables conditionalmarkup localtemplates descriptionend titlespacedend includefaqend simplenameend pagevariables conditionals concatenate explanation includeend especially bygroupend defaultend specified pagelists expensive beginning structure simpleend operation directive fullname defaults contains includes titleend sections previous cookbook created between current outputs without display pmwiki bullet exists anchor groups spaces append syntax words equal pages order first brief store site from self just used also have that this item each next last note when fmt and can the see for isn are don of 0
+Site.PageNotFound:1209340622: Site.PageNotFound : nolinkwikiwords administrators requestedpage pagenotfound displayed sitegroup fullname nofollow category contains message change locate italic unable create pmwiki action green doesn exist style auth edit this when text font rel can the if be
+Site.Preferences:1209340622: PmWiki.AccessKeys Site.Preferences : insert_your_name_here userconfigurations ak_recentchanges corresponding preferences ak_saveedit containing ak_preview components emphasized preferably ak_history accesskeys including somewhere customise preferred customize ak_strong indicated textarea settings setprefs cookbook personal profiles fullname location editform keyboard control trigger default various browser ak_edit editing windows columns created revert pmwiki cookie select e_cols e_rows italic action define these unset green newly ak_em sizes which about tells page this sets site also then hold find copy make keep like bold with that alt mac and tap see how if 20 70
+Site.Search:1209340622: PmWiki.PageLists : searchresults punctuation cellpadding cellspacing containing characters parameters pagelists quotation including beginning searchbox omitting enclosed advanced together followed examples searches special entered phrase border string pmwiki double single groups quotes equals colon apple words marks limit tasty those pages slash count trail width some will both find than food that also name main with need sign site link more your text for pie all fmt and use one can 100 of by
+Site.Site:1209340622: PmWiki.PasswordsAdmin Site.SideBar Site.EditForm Site.PageActions Site.PageNotFound Site.PageListTemplates Site.Preferences Site.AuthForm PmWiki.Passwords Site.AuthUser Site.InterMap PmWiki.InterMap Site.EditQuickReference Site.UploadQuickReference : uploadquickreference editquickreference pagelisttemplates configurations passwordsadmin administration administrators authorization pagenotfound pageactions preferences protection individual attributes requesting displayed uploading configure necessary sitewide contains changing contents editform intermap authform authuser identity username history sidebar editing default certain pmwiki browse create placed except output access locked layout change pages title group links skins other wikis apply based shown order local your need this only note here some with find when then menu like top may one add any etc set can all new key see and are php if by of be
+Site.UploadQuickReference:1209340622: PmWiki.Uploads Site.UploadQuickReference : uploadquickreference attachment attachlist extension wikigroup different uploading existing uploaded filename computer correct uploads bgcolor padding family browse scroll prefer action source 000000 f9f9f9 border within cccccc pmwiki simply newwin button enter after press class above solid files local field arial serif this page view down that have site been edit text sure find your once same disk make sans font size 12px the can for has 1px use its of 3 4 5
+SiteAdmin.AuthList:1209340622: SiteAdmin.AuthList : groupattributes administrative passwdupload cellspacing permissions cellpadding authlistend passwdread passwdattr passwdedit displayed siteadmin pagecount protected pagelist template defaults password fullname settings displays request indent exists fields action pages equal order login first false class need this view nbsp that have last mean with each them say for you all may fmt if to 0 1
+SiteAdmin.AuthUser:1209340622: PmWiki.AuthUser PmWiki.LocalCustomizations PmWiki.Passwords : sj593ercmttjm3fk26hcv1 localcustomizations defaultpasswords nolinkwikiwords enableauthuser htdeaxyyyo8hc9 authorizations configuration include_once instructions appropriate wonderland filesystem extensions encrypted something authorize specified siteadmin obtaining localhost uncomment belonging examples username accounts 0gcdan1a wsp2r80i external htpasswd specific identity editors writers enabled present xv30yz1 leading builder appears specify sources scripts pmwiki action groups logged either result people define admins alice carol login farmd mysql table based saved pages doesn note that with ldap sign path line attr dave then this them form will from like look when have mean your php see aka uid sub bob out add are any db
+SiteAdmin.GroupAttributes:1209340622:  : groupattributes siteadmin
+SiteAdmin.Status:1209340622:  : versionnum siteadmin running comment status edits local lost this page any may to be
+Site.RecentChanges:1209340622:  : recentchanges sidebar silvia april site 2008 by 12 28 at 13 am
+Main.HomePage:1209340608: Main.Downloads Main.Graphedit Main.EncTheoraGraphedit Main.History Main.SseBuilds : enctheoragraphedit 840e737bedd5c63b oggcodecs_src_0 documentation demultiplexer feb68d00f298 acceleration 588fec1aded9 applications experimental particularly installation displaylang multiplexed complaining development dangerously sourceforge oggcodecs_0 framerates accurately package_id directshow developers apparently corevorbis identical liisachan microsoft downloads character showfiles installer ssebuilds important reference uninstall installed condition sometimes something radicaled artefacts localhost priority cddca2d5 register features 8d2fd10b integral properly registry unstable group_id handling bugfixes hardware remnants rounding unzipped response 9216652f japanese familyid encoding versions directx9 projects programs problems bsplayer accident slashdot previous conflict extended starting homepage classic seeking appears windows current updated changes looki
 ng details release subtype getting another enforce weekend history missing already streams chained encoded locales dragged similar certain monitor playing demuxer testing without uploads gabests filters example working ffdshow disable inbuilt double issues thanks detect should attach browse caused oggdsf option cannot handle branch having latest expect graphs remove follow closed native though design either recent tobias likely fairly silvia audio names tries there which crash media known could least speex fixed these clean 82303 video using under 84799 about stuff masks after split doing those codes their major found basic seems bytes users below where trunk while would steps most wait this will http also they from find main that docs when 4f98 more 6d75 guid 2006 0946 5841 4a6b race live 8905 flac 1838 then aspx b7b5 51e0 402e high soon make into sure bond want just sets sync 0827 37mb xiph sse2 you may due wmp who ogm any www way net add non svn sdk one 3xx web cda mpc ol
 d rip don too 824 901 api new php if 70 71 97 72 go
+Main.SseBuilds:1209340433: Main.HomePage : oggcodecs_sse2_0 oggcodecs_sse_0 instructions experimental performance improvement compatible processors appreciate installing directshow ssebuilds uninstall supports bugfixes download homepage specific previous official playback windows changes pentium network program athlons version machine testing current enabled instant seeking filters release whether drives before theora mainly tested attach almost system encode vorbis normal really bytes about found crash these doubt wrong audio would where fixed close maybe speex haven speed using they your flac 8333 some only know 2004 note this from them stop will even also none 992 504 985 zip 275 end use are and old any don run let 15 68 06 my 12
+Main.EncTheoraGraphedit:1209339628: Main.HomePage : show_rendered_graph enctheoragraphedit select_render_file filter_properties theora_properties remove_renderers connect_encoders select_encoders fully_connected pin_properties encoders_added comprehensive find_encoders select_muxer association transcoding ensure_yv12 directshow favourites previously connecting proeprties parameters successful transcoded depending localhost overwrite different something important whichever selecting available processor following indicates inacurate versions property settings homepage clicking together tutorial finished progress explains encoding external removing slightly directx9 dragging directly playback options uploads depends proceed replace decoder filters include spawned encoded focuses however loading install source normal before oggdsf should vorbis images mainly format button silvia output please bottom border insert delete really always appear inputs branch modify future stream cho
 ose browse either there empty again right ready first apply means valid setup press after check usage close green under media using brief looks these steps types video files exact data from menu also what http when goes your will then this yuy2 next that want item pins more wait like open have with note each blue need come icon tree site time them been make left they much one was jpg now top has bar see and new may can don sdk raw box key yet did by 5a of my 5b 2b 10 2a 1b 1a 7 3 8 6 4
+Main.Graphedit:1209313443:  : wave_to_vorbis_graphedit mp3_to_vorbis_graphedit vorbis_to_mp3_graphedit wma_to_vorbis_graphedit mp3_to_speex_graphedit ogg_split_graphedit transcoding polycrystal directshow localhost splitting component waixwave encoding uploads theora images silvia graphs oggdsf movies sample parts index visit http file main some lego html jpg man www org php
+Main.About:1209311639: Main.DeveloperInfo : implementation developerinfo distribution applications development information suggestions illiminable commercial validating directshow attachment meaningful committing developers expecting platforms debugging australia libraries questions hopefully oggcodecs available basically currently afternoon something increases freenode february subjects projects anything familiar ignoring pipeline decoders probably complete holidays includes multiple solution friendly remember contains released feedback encoders formats annodex instant windows mailing provide amongst apache2 planned contact reports shorter section respond solidly seeking usually license besides filters servers evening either likely stable module please vorbis people things author theora months really within answer though source player chance useful marked email could cycle first found about goals state build stats class media using which early under there might years these 
 lists files being tools again tell more xiph want have much last will didn busy main send time user make your then case that they once spam spot easy such gone navi nick from also find lost http 2006 used both open well this next over many only soon rest most and are spy can aim don get net org try svn gmt web irc www bsd not lot few got via was cx of if my by 8 7 1
+Main.DeveloperInfo:1209310040:  : libdirectshowabstracts libvorbiscommentdotnet libtemporaluridotnet libcmmlparsedotnet libcmmltagsdotnet libdsplaydotnet implementation oooggvalidate encapsulation underpinnings functionality specification developerinfo manipulating structurally liboooggseek applications performance mod_oggchef recomposing development independant dynamically liboggchef seektables debugging available resources packetise validates oggcodecs libraries generates fragments efficient documents paginator container functions oooggdump exception grabbing provides pfeiffer elements creating routines problems parsing showing library filters version several objects balance annodex playing seeking strings classes control streams windows packets caching similar latency volume player format offers common simple server module images apache parses easily offset called useful helper exists allows breaks header files still based below early media tools which pause video draft t
 hese build sizes query those found dumps rapid pages occur this with work that main will also http side html done unix core port stop data high even away from such uses most time well and sdk www mac osx you xml via can hex any 02 by v2 01
+Main.Downloads:1209309544:  : automatically optimisations compatability additionally particularly dramatically compatablity acceleration integration dangerously oggcodecs_0 necessarily maintaining unreleased optionally priorities thoroughly accurately dependancy supporting interfaces increases extremely installer libtheora associate currently operating graphedit sometimes condition reference different emulating artefacts downloads available explorer decoding handling improved playlist unstable bugfixes repeated updating encoding previous property releases checking bleeding viewable subtitle possibly slashdot slightly interest properly features recently response decoders encoders obsolete prompted versions revision graphics hardware offering without unicode seeking changes tagging windows detects another classic updated weekend package average details unicows correct working bugixes updates project include whether systems appears exposes options dragged monitor playing testin
 g silence channel perfect willing missing regular integer forward between bufixes mobile latest aspect caused moving attach fairly allows better portal vorbis tested source please visual thanks switch player faster double 2beta1 partly mainly output should ported studio delays custom remove pretty offers effort future larger report builds likely refuse major where fixed pages track codes would crash moved there paths bytes which error files speed start needs media still while order after speex minor again means small could about added shell those seems video using these point vista quite stage being their click frame chars usual doing right daily 2006 plan flac that hasn this very when edge just fish icon been menu 2005 more 1936 made have xiph 1838 does keep from full also bugs what 0946 tell long yuy2 size sure 900k take user docs find they know only many masm http trim done fail race live 864 426 wmp but new yet lot was old you exe 901 824 crt mmx 3xx had ols two who 800 
 may bit ogm 448 vs 30 25 9x 32 21 02 70 71 72 17 73 10
+Site.SideBar:1209305607: Main.HomePage Main.Downloads Main.DeveloperInfo Main.History Main.About Site.SideBar : developerinfo documentation sourceforge downloads homepage sidehead sidebar history annodex theora vorbis action speex right about edit flac main site http docs xiph www com net

Added: trunk/oggdsf/website/wiki.d/Main.About
===================================================================
--- trunk/oggdsf/website/wiki.d/Main.About	                        (rev 0)
+++ trunk/oggdsf/website/wiki.d/Main.About	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,19 @@
+version=pmwiki-2.2.0-beta65 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-GB; rv:1.9b5) Gecko/2008032619 Firefox/3.0b5
+author=silvia
+charset=ISO-8859-1
+csum=
+ctime=1209311585
+host=::1
+name=Main.About
+rev=2
+targets=Main.DeveloperInfo
+text=!! Goals%0a%0aThe aim of this project is to provide the most complete implementation of the [[http://www.xiph.org/ | xiph.org]] codecs for Windows and Directshow. This includes decoders and encoders for all the xiph.org formats as well as [[http://www.annodex.net | annodex]]. It is released under a BSD license, so they can be used by both open-source and commercial applications.%0a%0a!! Current State%0a%0aBesides the directshow filters which many people are familiar with. The source distribution also contains many useful tools, for debugging and validating ogg files, which build on multiple platforms. There is also a .NET media player class which can basically provide an "instant" media player in any .NET application, as well as an early implementation of an apache2 module which can provide server side seeking (currently only of annodex files, but soon also ogg files).%0a%0aMore information about the libraries and tools that are available in the source distribution can 
 be found in the [[Main/DeveloperInfo | developers section]].%0a%0a!! In the pipeline%0a%0aMany things are planned, I'm not committing solidly to anything! Though as at February 2006, you can expect to see a lot more development over the next few months, and hopefully for the rest of this year. We might get to 1.0 one of these years, with the goal being for the most complete, stable and user friendly solution for Xiph codecs on Windows.%0a%0aI was really busy last year and didn't get to do much, hopefully 2006 will see a much shorter release cycle.%0a%0a!! Contact me%0a%0aIf you have questions, bug reports, feedback, suggestions, or want to tell me about your projects using oggcodecs you can contact me via email at ogg at illiminable.com . I try to answer all email, if you email me and I don't respond within 7 days I am not ignoring you, your email probably got lost amongst all the spam, or I've gone on holidays! In either case, if I don't respond, email me again. Please make yo
 ur subjects meaningful, so they are easy to spot amongst the spam. Don't attach files to your first email to me, that increases the chance it will be marked as spam. If you have something you want to send me, tell me in your first email, and then once I respond I will tell you how to get the file to me, or I'll be expecting an attachment from you.%0a%0aYou can also usually find me on IRC on Freenode servers (www.freenode.net) in #vorbis, #theora or #annodex. Remember I'm in Australia (GMT+8) so I'm more likely to respond in the afternoon/evening my time. My nick is illi.%0a%0aYou could also try the xiph.org mailing lists, such as vorbis-dev.%0a%0aOr if you want to see the svn commit information on the web, you can spy on me here with [[http://cia.navi.cx/stats/author/illiminable | CIA]].
+time=1209311639
+author:1209311639=silvia
+diff:1209311639:1209311585:minor=9,10c9,10%0a%3c More information about the libraries and tools that are available in the source distribution can be found in the [[Main/DeveloperInfo | developers section]].%0a%3c %0a---%0a> More information about the libraries and tools that are available in the source distribution can be found in the [[Main/Developers | developers section]].%0a> %0a25c25%0a%3c Or if you want to see the svn commit information on the web, you can spy on me here with [[http://cia.navi.cx/stats/author/illiminable | CIA]].%0a\ No newline at end of file%0a---%0a> Or if you want to see the svn commit information on the web, you can spy on me here with [[http://cia.navi.cx/stats/author/illiminable | CIA]]%0a\ No newline at end of file%0a
+host:1209311639=::1
+author:1209311585=silvia
+csum:1209311585=added Zen's original text
+diff:1209311585:1209311585:=1,25d0%0a%3c !! Goals%0a%3c %0a%3c The aim of this project is to provide the most complete implementation of the [[http://www.xiph.org/ | xiph.org]] codecs for Windows and Directshow. This includes decoders and encoders for all the xiph.org formats as well as [[http://www.annodex.net | annodex]]. It is released under a BSD license, so they can be used by both open-source and commercial applications.%0a%3c %0a%3c !! Current State%0a%3c %0a%3c Besides the directshow filters which many people are familiar with. The source distribution also contains many useful tools, for debugging and validating ogg files, which build on multiple platforms. There is also a .NET media player class which can basically provide an "instant" media player in any .NET application, as well as an early implementation of an apache2 module which can provide server side seeking (currently only of annodex files, but soon also ogg files).%0a%3c %0a%3c More information about the li
 braries and tools that are available in the source distribution can be found in the [[Main/Developers | developers section]].%0a%3c %0a%3c !! In the pipeline%0a%3c %0a%3c Many things are planned, I'm not committing solidly to anything! Though as at February 2006, you can expect to see a lot more development over the next few months, and hopefully for the rest of this year. We might get to 1.0 one of these years, with the goal being for the most complete, stable and user friendly solution for Xiph codecs on Windows.%0a%3c %0a%3c I was really busy last year and didn't get to do much, hopefully 2006 will see a much shorter release cycle.%0a%3c %0a%3c !! Contact me%0a%3c %0a%3c If you have questions, bug reports, feedback, suggestions, or want to tell me about your projects using oggcodecs you can contact me via email at ogg at illiminable.com . I try to answer all email, if you email me and I don't respond within 7 days I am not ignoring you, your email probably got lost amongst a
 ll the spam, or I've gone on holidays! In either case, if I don't respond, email me again. Please make your subjects meaningful, so they are easy to spot amongst the spam. Don't attach files to your first email to me, that increases the chance it will be marked as spam. If you have something you want to send me, tell me in your first email, and then once I respond I will tell you how to get the file to me, or I'll be expecting an attachment from you.%0a%3c %0a%3c You can also usually find me on IRC on Freenode servers (www.freenode.net) in #vorbis, #theora or #annodex. Remember I'm in Australia (GMT+8) so I'm more likely to respond in the afternoon/evening my time. My nick is illi.%0a%3c %0a%3c You could also try the xiph.org mailing lists, such as vorbis-dev.%0a%3c %0a%3c Or if you want to see the svn commit information on the web, you can spy on me here with [[http://cia.navi.cx/stats/author/illiminable | CIA]]%0a\ No newline at end of file%0a
+host:1209311585=::1

Added: trunk/oggdsf/website/wiki.d/Main.DeveloperInfo
===================================================================
--- trunk/oggdsf/website/wiki.d/Main.DeveloperInfo	                        (rev 0)
+++ trunk/oggdsf/website/wiki.d/Main.DeveloperInfo	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,16 @@
+version=pmwiki-2.2.0-beta65 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-GB; rv:1.9b5) Gecko/2008032619 Firefox/3.0b5
+author=silvia
+charset=ISO-8859-1
+csum=original Zen's page
+ctime=1209310040
+host=::1
+name=Main.DeveloperInfo
+rev=1
+targets=
+text=!! Useful libraries in the SDK%0a%0aWith the exception of the .NET libraries, all those below will build on Windows, Mac OSX and Unix.%0a%0a!!! libOOOgg%0alibOOOgg is an independant implementation of the ogg encapsulation format. It provides a C++/OO set of classes for manipulating ogg pages and packets, and to paginator and packetise ogg files or streams. It provides similar functionality to libogg.%0a%0a!!! libOOOggSeek%0alibOOOggSeek provides seektable based routines for seeking in ogg or annodex files, for rapid and efficient seeking as well as caching seektables for high performance low latency uses.%0a%0a!!! libTemporalURI%0alibTemporalURI provides parsing functions for the [[[http://www.annodex.net/TR/draft-pfeiffer-temporal-fragments-02.html | temporal URI specification]] which allows you to query media resources from a server by time offset in a URI. Also a .NET port of this library exists as libTemporalURIDotNET.%0a%0a!!! libDSPlayDotNET%0alibDSPlay is a libra
 ry which provides media player functionality to .NET applications. It abstracts away all the directshow underpinnings and offers a simple API to control the media, which can be easily called from any .NET application. It provides all the most common media player functionality such as play, pause, stop, seek, volume, balance and even grabbing images from a playing video.%0a%0a!!! libOggChef%0alibOggChef is a helper library for dynamically recomposing ogg and annodex files. It is still in early development. This is the core of the work done by the apache module (see below).%0a%0a!!! mod_oggchef%0amod_oggchef is an apache 2 module, which provides server side seeking via temporal URI's for ogg and annodex files. It is still in early development.%0a%0a!!! libCMMLTags%0alibCMMLTags is a container class library for manipulating [[http://www.annodex.net/TR/draft-pfeiffer-cmml-01.html | CMML V2.0]] documents and elements. It is also available in a .NET library as libCMMLTagsDotNET.%0
 a%0a!!! libCMMLParse%0alibCMMLParse is a parsing library for CMML V2.0 It parses xml and generates the objects found in libCMMLTags. This is also available in a .NET version as libCMMLParseDotNET.%0a%0a!!! libDirectshowAbstracts%0alibDirectshowAbstracts provides several useful classes for creating directshow filters. All the directshow filters in oggcodecs use these.%0a%0a!!! libVorbisComment%0alibVorbisComment is a parsing library for parsing and manipulating vorbis comment strings. It is also available as a .NET library as libVorbisCommentDotNet.%0a%0a%0a!! Useful tools in the SDK%0a%0a[=OOOggDump=] provides hex dumps of ogg files showing header data and packet sizes and breaks. It is useful for debugging problems that can occur in ogg files.%0a%0a!!! [=OOOggValidate=]%0a[=OOOggValidate=] validates an ogg file structurally.%0a
+time=1209310040
+author:1209310040=silvia
+csum:1209310040=original Zen's page
+diff:1209310040:1209310040:=1,41d0%0a%3c !! Useful libraries in the SDK%0a%3c %0a%3c With the exception of the .NET libraries, all those below will build on Windows, Mac OSX and Unix.%0a%3c %0a%3c !!! libOOOgg%0a%3c libOOOgg is an independant implementation of the ogg encapsulation format. It provides a C++/OO set of classes for manipulating ogg pages and packets, and to paginator and packetise ogg files or streams. It provides similar functionality to libogg.%0a%3c %0a%3c !!! libOOOggSeek%0a%3c libOOOggSeek provides seektable based routines for seeking in ogg or annodex files, for rapid and efficient seeking as well as caching seektables for high performance low latency uses.%0a%3c %0a%3c !!! libTemporalURI%0a%3c libTemporalURI provides parsing functions for the [[[http://www.annodex.net/TR/draft-pfeiffer-temporal-fragments-02.html | temporal URI specification]] which allows you to query media resources from a server by time offset in a URI. Also a .NET port of this library
  exists as libTemporalURIDotNET.%0a%3c %0a%3c !!! libDSPlayDotNET%0a%3c libDSPlay is a library which provides media player functionality to .NET applications. It abstracts away all the directshow underpinnings and offers a simple API to control the media, which can be easily called from any .NET application. It provides all the most common media player functionality such as play, pause, stop, seek, volume, balance and even grabbing images from a playing video.%0a%3c %0a%3c !!! libOggChef%0a%3c libOggChef is a helper library for dynamically recomposing ogg and annodex files. It is still in early development. This is the core of the work done by the apache module (see below).%0a%3c %0a%3c !!! mod_oggchef%0a%3c mod_oggchef is an apache 2 module, which provides server side seeking via temporal URI's for ogg and annodex files. It is still in early development.%0a%3c %0a%3c !!! libCMMLTags%0a%3c libCMMLTags is a container class library for manipulating [[http://www.annodex.net/TR/
 draft-pfeiffer-cmml-01.html | CMML V2.0]] documents and elements. It is also available in a .NET library as libCMMLTagsDotNET.%0a%3c %0a%3c !!! libCMMLParse%0a%3c libCMMLParse is a parsing library for CMML V2.0 It parses xml and generates the objects found in libCMMLTags. This is also available in a .NET version as libCMMLParseDotNET.%0a%3c %0a%3c !!! libDirectshowAbstracts%0a%3c libDirectshowAbstracts provides several useful classes for creating directshow filters. All the directshow filters in oggcodecs use these.%0a%3c %0a%3c !!! libVorbisComment%0a%3c libVorbisComment is a parsing library for parsing and manipulating vorbis comment strings. It is also available as a .NET library as libVorbisCommentDotNet.%0a%3c %0a%3c %0a%3c !! Useful tools in the SDK%0a%3c %0a%3c [=OOOggDump=] provides hex dumps of ogg files showing header data and packet sizes and breaks. It is useful for debugging problems that can occur in ogg files.%0a%3c %0a%3c !!! [=OOOggValidate=]%0a%3c [=OOOggVa
 lidate=] validates an ogg file structurally.%0a
+host:1209310040=::1

Added: trunk/oggdsf/website/wiki.d/Main.Downloads
===================================================================
--- trunk/oggdsf/website/wiki.d/Main.Downloads	                        (rev 0)
+++ trunk/oggdsf/website/wiki.d/Main.Downloads	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,22 @@
+version=pmwiki-2.2.0-beta65 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-GB; rv:1.9b5) Gecko/2008032619 Firefox/3.0b5
+author=silvia
+charset=ISO-8859-1
+csum=
+ctime=1209309332
+host=::1
+name=Main.Downloads
+rev=3
+targets=
+text=!! About the downloads%0a%0aFrom now on, there will be unstable releases made available. This allows me to keep one stable version for the average user and another version for those who like to keep up with that latest features, and are willing to live dangerously. This seems better than what recently has been long delays between releases. This is partly prompted by version 0.72.1838 which has a lot of new code and bufixes but which hasn't been thoroughly tested yet. At this stage I plan to keep a more regular unstable release, and possibly in the future a daily or very regular bleeding edge release.%0a%0aUnstable does not necessarily mean that it will crash more. It just means it hasn't been tested, so it may or may not be as stable as a proper release.%0a%0aAdditionally some major changes to add some new features and in particular to maintain 9X support while moving forward to full unicode support have caused the package size to increase quite dramatically from the 80
 0-900k of the previous builds. At some point in the future, I will take some effort to trim this down again, and will also likely start offering two different releases. One with only the decoders which will be pretty small, and one with all the encoders and decoders and to ols which will be slightly larger.%0a%0aAs usual, please report bugs you find to me, being sure to tell me which version you are using.%0a%0aCurrent priorities - Better encoding support, vista support, tagging, shell integration, Windows Mobile 5 support.%0a%0a%0a!! Current Stable Version (0.71.0946) - 24/02/2006%0a%0aMore bugfixes, particularly to theora. See 0.70 release for more details about recent changes. Docs and source package will be updated on the weekend, there's no major changes there from 0.70. This version is fairly stable now it seems.%0a%0a!!![[(Attach:)oggcodecs_0.71.0946.exe | Download Now (824,901 bytes)]]%0a%0a%0a!!! Changes this version%0a%0a* Fixed the theora seeking bug, should accur
 ately seek to any frame without artefacts.%0a* Fixed bug not handling WMP doing hardware video acceleration, caused crash on some files (Thanks slashdot!)%0a* Fixed handling of missing 3xx http response codes%0a* Fixed bug where player would crash if you dragged it from one monitor to another while playing%0a* Fixed COM reference double-release bug%0a* Fixed race condition which could crash or hang sometimes after a seek.%0a%0a%0a!! Current UNSTABLE Version (0.73.1936) - 21/10/2006%0a%0aThis version mainly exposes encoding options for all the codecs as COM interfaces, and as property pages (viewable in graphedit). Still needs more testing and error checking. Fixed a bug with flac that caused silence when a track automatically repeated. The aspect ratio handling in theora is now correct, the channel order in vorbis is now correct. And now explorer has the "Add to WMP playlist" option, which other media files have in their right-click menu. %0a%0a%0a!!![[(Attach:)oggcodecs_0.7
 3.1936.exe | Download Now (1,448,800 bytes)]]%0a%0a%0a!!! Changes this version%0a%0a* Encode options for theora, vorbis, speex and flac and property pages in graphedit%0a* Improved OGM decoding%0a* Improved subtitle support%0a* Vorbis channel order fixed%0a* 24/32 bit >2 channel decode support improved for vorbis and flac%0a* Fix end of file/repeat bug in flac%0a* Correct handling of aspect ratio in theora%0a* "Add to playlist" option for WMP appears in explorer right-click menu%0a%0a%0a!! Previous UNSTABLE Version (0.72.1838) - 17/9/2006%0a%0aMajor changes in this version include, updating all the code to Visual Studio 2005. There is now a "working" port for Windows Mobile 5.0 as at this revision, this is not yet released. Many minor bugixes and compatability fixes, dependancy updates, speed increases, unicode support, improved installer. Some major work was done to maintain Windows 9X/ME support while properly supporting unicode. If you use or have an interest in the maint
 aining of support for these obsolete operating systems, please let me know whether they are working for you.%0a%0a%0a!!![[(Attach:)oggcodecs_0.72.1838.exe | Download Now (1,426,864 bytes)]]%0a%0a%0a!!! Changes this version%0a%0a* Fixed bug that would refuse to play extremely small files%0a* Added [=YUY2=] output support to better support old graphics hardware%0a* Updated speex to 1.2beta1%0a* Updated project to VS 2005%0a* Using theora-exp for theora decoding ~30%25 speed up%0a* Improved 24/32 bit support for FLAC (still may not be perfect)%0a* All code moved to unicode. Fixed bug which would fail if paths had unicode chars%0a* Custom unicode emulating(unicows) CRT's to maintain Windows 9X support%0a* Compatablity fixes for Media Portal and Media Player Classic%0a* Installer detects and offers to remove previous versions%0a* Installer offers to optionally associate WMP to .ogg%0a* MMX optimisations for libtheora ported to MASM, encoding ~25-30%25 faster%0a* Xiph fish icon in
  explorer%0a* Code ported to Windows Mobile 5.0 (currently unreleased build)%0a* Switch to integer decoding version of speex%0a
+time=1209309544
+author:1209309544=silvia
+diff:1209309544:1209309504:minor=62c62%0a%3c * Added [=YUY2=] output support to better support old graphics hardware%0a---%0a> * Added YUY2 output support to better support old graphics hardware%0a
+host:1209309544=::1
+author:1209309504=silvia
+diff:1209309504:1209309332:minor=20d19%0a%3c %0a38d36%0a%3c %0a57d54%0a%3c %0a
+host:1209309504=::1
+author:1209309332=silvia
+csum:1209309332=added Zen's original text
+diff:1209309332:1209309332:=1,72d0%0a%3c !! About the downloads%0a%3c %0a%3c From now on, there will be unstable releases made available. This allows me to keep one stable version for the average user and another version for those who like to keep up with that latest features, and are willing to live dangerously. This seems better than what recently has been long delays between releases. This is partly prompted by version 0.72.1838 which has a lot of new code and bufixes but which hasn't been thoroughly tested yet. At this stage I plan to keep a more regular unstable release, and possibly in the future a daily or very regular bleeding edge release.%0a%3c %0a%3c Unstable does not necessarily mean that it will crash more. It just means it hasn't been tested, so it may or may not be as stable as a proper release.%0a%3c %0a%3c Additionally some major changes to add some new features and in particular to maintain 9X support while moving forward to full unicode support have caused
  the package size to increase quite dramatically from the 800-900k of the previous builds. At some point in the future, I will take some effort to trim this down again, and will also likely start offering two different releases. One with only the decoders which will be pretty small, and one with all the encoders and decoders and to ols which will be slightly larger.%0a%3c %0a%3c As usual, please report bugs you find to me, being sure to tell me which version you are using.%0a%3c %0a%3c Current priorities - Better encoding support, vista support, tagging, shell integration, Windows Mobile 5 support.%0a%3c %0a%3c %0a%3c !! Current Stable Version (0.71.0946) - 24/02/2006%0a%3c %0a%3c More bugfixes, particularly to theora. See 0.70 release for more details about recent changes. Docs and source package will be updated on the weekend, there's no major changes there from 0.70. This version is fairly stable now it seems.%0a%3c %0a%3c !!![[(Attach:)oggcodecs_0.71.0946.exe | Download 
 Now (824,901 bytes)]]%0a%3c %0a%3c !!! Changes this version%0a%3c %0a%3c * Fixed the theora seeking bug, should accurately seek to any frame without artefacts.%0a%3c * Fixed bug not handling WMP doing hardware video acceleration, caused crash on some files (Thanks slashdot!)%0a%3c * Fixed handling of missing 3xx http response codes%0a%3c * Fixed bug where player would crash if you dragged it from one monitor to another while playing%0a%3c * Fixed COM reference double-release bug%0a%3c * Fixed race condition which could crash or hang sometimes after a seek.%0a%3c %0a%3c %0a%3c !! Current UNSTABLE Version (0.73.1936) - 21/10/2006%0a%3c %0a%3c This version mainly exposes encoding options for all the codecs as COM interfaces, and as property pages (viewable in graphedit). Still needs more testing and error checking. Fixed a bug with flac that caused silence when a track automatically repeated. The aspect ratio handling in theora is now correct, the channel order in vorbis is now
  correct. And now explorer has the "Add to WMP playlist" option, which other media files have in their right-click menu. %0a%3c %0a%3c %0a%3c !!![[(Attach:)oggcodecs_0.73.1936.exe | Download Now (1,448,800 bytes)]]%0a%3c %0a%3c !!! Changes this version%0a%3c %0a%3c * Encode options for theora, vorbis, speex and flac and property pages in graphedit%0a%3c * Improved OGM decoding%0a%3c * Improved subtitle support%0a%3c * Vorbis channel order fixed%0a%3c * 24/32 bit >2 channel decode support improved for vorbis and flac%0a%3c * Fix end of file/repeat bug in flac%0a%3c * Correct handling of aspect ratio in theora%0a%3c * "Add to playlist" option for WMP appears in explorer right-click menu%0a%3c %0a%3c %0a%3c !! Previous UNSTABLE Version (0.72.1838) - 17/9/2006%0a%3c %0a%3c Major changes in this version include, updating all the code to Visual Studio 2005. There is now a "working" port for Windows Mobile 5.0 as at this revision, this is not yet released. Many minor bugixes and co
 mpatability fixes, dependancy updates, speed increases, unicode support, improved installer. Some major work was done to maintain Windows 9X/ME support while properly supporting unicode. If you use or have an interest in the maintaining of support for these obsolete operating systems, please let me know whether they are working for you.%0a%3c %0a%3c %0a%3c !!![[(Attach:)oggcodecs_0.72.1838.exe | Download Now (1,426,864 bytes)]]%0a%3c %0a%3c !!! Changes this version%0a%3c %0a%3c * Fixed bug that would refuse to play extremely small files%0a%3c * Added YUY2 output support to better support old graphics hardware%0a%3c * Updated speex to 1.2beta1%0a%3c * Updated project to VS 2005%0a%3c * Using theora-exp for theora decoding ~30%25 speed up%0a%3c * Improved 24/32 bit support for FLAC (still may not be perfect)%0a%3c * All code moved to unicode. Fixed bug which would fail if paths had unicode chars%0a%3c * Custom unicode emulating(unicows) CRT's to maintain Windows 9X support%0a%
 3c * Compatablity fixes for Media Portal and Media Player Classic%0a%3c * Installer detects and offers to remove previous versions%0a%3c * Installer offers to optionally associate WMP to .ogg%0a%3c * MMX optimisations for libtheora ported to MASM, encoding ~25-30%25 faster%0a%3c * Xiph fish icon in explorer%0a%3c * Code ported to Windows Mobile 5.0 (currently unreleased build)%0a%3c * Switch to integer decoding version of speex%0a
+host:1209309332=::1

Added: trunk/oggdsf/website/wiki.d/Main.EncTheoraGraphedit
===================================================================
--- trunk/oggdsf/website/wiki.d/Main.EncTheoraGraphedit	                        (rev 0)
+++ trunk/oggdsf/website/wiki.d/Main.EncTheoraGraphedit	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,34 @@
+version=pmwiki-2.2.0-beta65 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-GB; rv:1.9b5) Gecko/2008032619 Firefox/3.0b5
+author=silvia
+charset=ISO-8859-1
+csum=
+ctime=1209313683
+host=::1
+name=Main.EncTheoraGraphedit
+rev=6
+targets=Main.HomePage
+text=!! How to encode theora files with directshow%0a%0aIf you have come to this page from an external site, please note before following these steps you need to install the [[Main/HomePage | directshow filters]] on my main page.%0a%0aThis brief tutorial explains how to use the directshow filter in association with graphedit to encode or transcode ogg theora. It focuses mainly on transcoding, but by using different source filters you can also encode raw data.%0a%0aGraphedit is available in the [=DirectX9=] SDK.%0a%0a%0a'''Step 1a - Load File'''%0a%0aAfter loading up graphedit, from the file menu choose "Render Media File..." and browse to select the file you want to transcode.%0ahttp://localhost/~silvia/oggdsf/uploads/images/select_render_file.JPG"Select render file from the menu"%0a%0a%0a'''Step 1b - Rendered Graph'''%0a%0aIf it was successful, you should now have a fully rendered graph, that looks something like this. The exact filters will depends on your source file.%0ah
 ttp://localhost/~silvia/oggdsf/uploads/images/show_rendered_graph.JPG"This is the rendered graph"%0a%0a%0a'''Step 2a - Check media types'''%0a%0aRight click on the pin that inputs to the video renderer, and choose pin properties.%0ahttp://localhost/~silvia/oggdsf/uploads/images/pin_properties.JPG"Select pin proeprties"%0a%0a%0a'''Step 2b - Ensure [=YV12=] or [=YUY2=]'''%0a%0aOn the pin properties page check the media type is either [=YV12=] or [=YUY2=], if it is not, this file can not yet be transcoded directly. If it is then proceed.%0ahttp://localhost/~silvia/oggdsf/uploads/images/ensure_YV12.JPG"Select pin properties"%0a%0a%0a'''Step 3 - Remove renderers'''%0a%0aThis has rendered a graph for playback, what we want to do is remove the renderers from the graph, and replace them with our encoders and muxer. To remove the renderers click on them, they will get a blue border, then press the delete key. After removing the renderers, the graph should look something like this.%0a
 http://localhost/~silvia/oggdsf/uploads/images/remove_renderers.JPG"This is the rendered graph"%0a%0a%0a'''Step 4 - Find encoders'''%0a%0aThe first time you will need to find the encoders, by clicking the add filter icon, then selecting the directshow branch of the tree.%0ahttp://localhost/~silvia/oggdsf/uploads/images/find_encoders.JPG"Find the encoders"%0a%0a%0a'''Step 5a - Select encoders'''%0a%0aFind the vorbis encode filter and the theora encode filter, select each one and check the favourite filter box so next time the filter will be under favourites in the menu, click insert filter.%0ahttp://localhost/~silvia/oggdsf/uploads/images/select_encoders.JPG"Select the encoders"%0a%0a%0a'''Step 5b - Encoders Added to graph'''%0a%0aAfter the encoders have been added to the graph, it should look something like this.%0ahttp://localhost/~silvia/oggdsf/uploads/images/encoders_added.JPG"Graph after encoders added."%0a%0a%0a'''Step 6 - Connect the encoders'''%0a%0aBy dragging the ou
 tput pin of the decoder to the input of the encoder connect the filters together.%0ahttp://localhost/~silvia/oggdsf/uploads/images/connect_encoders.JPG"Connecting encoder pins."%0a%0a%0a'''Step 7 - Open the Theora Encoder Properties'''%0a%0aImportant: *BEFORE* connecting to the muxer, right click the filter and select it's property page.%0ahttp://localhost/~silvia/oggdsf/uploads/images/filter_properties.JPG"Selecting filter proeprties menu item."%0a%0a%0a'''Step 8 - Setup the encoder properties'''%0a%0aModify the settings and click apply or ok. Future versions will include more comprehensive options.%0ahttp://localhost/~silvia/oggdsf/uploads/images/theora_properties.JPG"Select encoding parameters."%0a%0a%0a'''Step 9 - Select Mux Filter'''%0a%0aSelect the Ogg Mux filter as you previously did for the encoders and connect the encoders to it. As you connect a pin a new one will be spawned.%0a%0aImportant: Whichever encoder is connected at *the bottom* is one that will appear *fi
 rst* in the encoded file. '''This means to make a valid theora file, the vorbis stream is added first to the top pin, then the theora stream to the next pin.%0ahttp://localhost/~silvia/oggdsf/uploads/images/select_muxer.JPG"Select Muxer."%0a%0a%0a'''Step 10 - Fully connected graph to play'''%0a%0aThe graph is now ready to go, and should look something like this. Press the play button and wait for the encoding to finish. It is finished when the play button goes green again. Close graphedit... don't press play again or it will overwrite the file. Depending on the source format it may show encoding progress in the progress bar, this is however slightly inacurate... the bar will appear to finish before the encoding has really finished. The progress bar indicates how much data has left the source. Look at the play button or check your processor to usage to see if it has finished.There will always be one empty pin at the bottom of the muxer, this is normal.%0ahttp://localhost/~sil
 via/oggdsf/uploads/images/fully_connected.JPG"Fully Connected graph"%0a
+time=1209339628
+author:1209339628=silvia
+diff:1209339628:1209339576:minor=28c28%0a%3c '''Step 2b - Ensure [=YV12=] or [=YUY2=]'''%0a---%0a> '''Step 2b - Ensure YV12 or YUY2'''%0a
+host:1209339628=::1
+author:1209339576=silvia
+csum:1209339576=formatting fixes
+diff:1209339576:1209339464:=7,9c7,9%0a%3c Graphedit is available in the [=DirectX9=] SDK.%0a%3c %0a%3c %0a---%0a> Graphedit is available in the DirectX9 SDK.%0a> %0a> %0a11d10%0a%3c %0a17d15%0a%3c %0a23d20%0a%3c %0a29,30c26%0a%3c %0a%3c On the pin properties page check the media type is either [=YV12=] or [=YUY2=], if it is not, this file can not yet be transcoded directly. If it is then proceed.%0a---%0a> On the pin properties page check the media type is either YV12 or YUY2, if it is not, this file can not yet be transcoded directly. If it is then proceed.%0a35d30%0a%3c %0a41d35%0a%3c %0a47d40%0a%3c %0a53d45%0a%3c %0a59d50%0a%3c %0a65d55%0a%3c %0a71d60%0a%3c %0a77d65%0a%3c %0a85d72%0a%3c %0a
+host:1209339576=::1
+author:1209339464=silvia
+csum:1209339464=formatting fixes
+diff:1209339464:1209338935:=12,14c12,14%0a%3c http://localhost/~silvia/oggdsf/uploads/images/select_render_file.JPG"Select render file from the menu"%0a%3c %0a%3c %0a---%0a> http://localhost/~silvia/oggdsf/uploads/images/select_render_file.JPG%0a> %0a> %0a16,74c16,114%0a%3c If it was successful, you should now have a fully rendered graph, that looks something like this. The exact filters will depends on your source file.%0a%3c http://localhost/~silvia/oggdsf/uploads/images/show_rendered_graph.JPG"This is the rendered graph"%0a%3c %0a%3c %0a%3c '''Step 2a - Check media types'''%0a%3c Right click on the pin that inputs to the video renderer, and choose pin properties.%0a%3c http://localhost/~silvia/oggdsf/uploads/images/pin_properties.JPG"Select pin proeprties"%0a%3c %0a%3c %0a%3c '''Step 2b - Ensure YV12 or YUY2'''%0a%3c On the pin properties page check the media type is either YV12 or YUY2, if it is not, this file can not yet be transcoded directly. If it is then proceed.%0a
 %3c http://localhost/~silvia/oggdsf/uploads/images/ensure_YV12.JPG"Select pin properties"%0a%3c %0a%3c %0a%3c '''Step 3 - Remove renderers'''%0a%3c This has rendered a graph for playback, what we want to do is remove the renderers from the graph, and replace them with our encoders and muxer. To remove the renderers click on them, they will get a blue border, then press the delete key. After removing the renderers, the graph should look something like this.%0a%3c http://localhost/~silvia/oggdsf/uploads/images/remove_renderers.JPG"This is the rendered graph"%0a%3c %0a%3c %0a%3c '''Step 4 - Find encoders'''%0a%3c The first time you will need to find the encoders, by clicking the add filter icon, then selecting the directshow branch of the tree.%0a%3c http://localhost/~silvia/oggdsf/uploads/images/find_encoders.JPG"Find the encoders"%0a%3c %0a%3c %0a%3c '''Step 5a - Select encoders'''%0a%3c Find the vorbis encode filter and the theora encode filter, select each one and check the
  favourite filter box so next time the filter will be under favourites in the menu, click insert filter.%0a%3c http://localhost/~silvia/oggdsf/uploads/images/select_encoders.JPG"Select the encoders"%0a%3c %0a%3c %0a%3c '''Step 5b - Encoders Added to graph'''%0a%3c After the encoders have been added to the graph, it should look something like this.%0a%3c http://localhost/~silvia/oggdsf/uploads/images/encoders_added.JPG"Graph after encoders added."%0a%3c %0a%3c %0a%3c '''Step 6 - Connect the encoders'''%0a%3c By dragging the output pin of the decoder to the input of the encoder connect the filters together.%0a%3c http://localhost/~silvia/oggdsf/uploads/images/connect_encoders.JPG"Connecting encoder pins."%0a%3c %0a%3c %0a%3c '''Step 7 - Open the Theora Encoder Properties'''%0a%3c Important: *BEFORE* connecting to the muxer, right click the filter and select it's property page.%0a%3c http://localhost/~silvia/oggdsf/uploads/images/filter_properties.JPG"Selecting filter proeprtie
 s menu item."%0a%3c %0a%3c %0a%3c '''Step 8 - Setup the encoder properties'''%0a%3c Modify the settings and click apply or ok. Future versions will include more comprehensive options.%0a%3c http://localhost/~silvia/oggdsf/uploads/images/theora_properties.JPG"Select encoding parameters."%0a%3c %0a%3c %0a%3c '''Step 9 - Select Mux Filter'''%0a%3c Select the Ogg Mux filter as you previously did for the encoders and connect the encoders to it. As you connect a pin a new one will be spawned.%0a%3c %0a%3c Important: Whichever encoder is connected at *the bottom* is one that will appear *first* in the encoded file. '''This means to make a valid theora file, the vorbis stream is added first to the top pin, then the theora stream to the next pin.%0a%3c http://localhost/~silvia/oggdsf/uploads/images/select_muxer.JPG"Select Muxer."%0a%3c %0a%3c %0a%3c '''Step 10 - Fully connected graph to play'''%0a%3c The graph is now ready to go, and should look something like this. Press the play bu
 tton and wait for the encoding to finish. It is finished when the play button goes green again. Close graphedit... don't press play again or it will overwrite the file. Depending on the source format it may show encoding progress in the progress bar, this is however slightly inacurate... the bar will appear to finish before the encoding has really finished. The progress bar indicates how much data has left the source. Look at the play button or check your processor to usage to see if it has finished.There will always be one empty pin at the bottom of the muxer, this is normal.%0a%3c http://localhost/~silvia/oggdsf/uploads/images/fully_connected.JPG"Fully Connected graph"%0a---%0a> If it was successful, you should now have a fully rendered graph, that looks something like thi%0a> s. The exact filters will depends on your source file.%0a> http://localhost/~silvia/oggdsf/uploads/images/show_rendered_graph.JPG"This is the r%0a> endered graph"%0a> %0a> %0a> %3cu>%3cb>Step 2a - Ch
 eck media types%3c/b>%3c/u>%3cbr>%0a> Right click on the pin that inputs to the video renderer, and choose pin properties.%3cbr>%0a> %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/pin_properties.JPG" alt="Select pin proeprt%0a> ies">%0a> %3cbr>%0a> %3cbr>%0a> %0a> %0a> %3cu>%3cb>Step 2b - Ensure YV12 or YUY2%3c/b>%3c/u>%3cbr>%0a> On the pin properties page check the media type is either YV12 or YUY2, if it is not, this file%0a>  can not yet be transcoded directly. If it is then proceed.%3cbr>%0a> %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/ensure_YV12.JPG" alt="Select pin properties%0a> ">%0a> %0a> %3cu>%3cb>Step 3 - Remove renderers%3c/b>%3c/u>%3cbr>%0a> This has rendered a graph for playback, what we want to do is remove the renderers from the gra%0a> ph, and replace them with our encoders and muxer. To remove the renderers click on them, they w%0a> ill get a blue border, then press the delete key. After removing the renderers, the graph shoul%0a> d lo
 ok something like this.%3cbr>%0a> %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/remove_renderers.JPG" alt="This is the rend%0a> ered graph">%0a> %3cbr>%0a> %3cbr>%0a> %0a> %0a> %3cu>%3cb>Step 4 - Find encoders%3c/b>%3c/u>%3cbr>%0a> The first time you will need to find the encoders, by clicking the add filter icon, then select%0a> ing the directshow branch of the tree.%3cbr>%0a> %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/find_encoders.JPG" alt="Find the encoders">%0a> %3cbr>%0a> %3cbr>%0a> %0a> %3cu>%3cb>Step 5a - Select encoders%3c/b>%3c/u>%3cbr>%0a> Find the vorbis encode filter and the theora encode filter, select each one and check the favou%0a> rite filter box so next time the filter will be under favourites in the menu, click insert filt%0a> er.%3cbr>%0a> %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/select_encoders.JPG" alt="Select the encode%0a> rs">%0a> %3cbr>%0a> %3cbr>%0a> %0a> %3cu>%3cb>Step 5b - Encoders Added to graph%3c/b>%3c/u>
 %3cbr>%0a> After the encoders have been added to the graph, it should look something like this.%3cbr>%0a> %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/encoders_added.JPG" alt="Graph after encode%0a> rs added.">%0a> %3cbr>%0a> %3cbr>%0a> %0a> %3cu>%3cb>Step 6 - Connect the encoders%3c/b>%3c/u>%3cbr>%0a> By dragging the ouput pin of the decoder to the input of the encoder connect the filters togeth%0a> er.%3cbr>%0a> %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/connect_encoders.JPG" alt="Connecting encod%0a> er pins.">%0a> %0a> %0a> %3cu>%3cb>Step 7 - Open the Theora Encoder Properties%3c/b>%3c/u>%3cbr>%0a> Important: *BEFORE* connecting to the muxer, right click the filter and select it's proeprty pa%0a> ge.%3cbr>%0a> %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/filter_properties.JPG" alt="Selecting filte%0a> r proeprties menu item.">%0a> %3cbr>%0a> %3cbr>%0a> %0a> %3cu>%3cb>Step 8 - Setup the encoder properties%3c/b>%3c/u>%3cbr>%0a> Modify the
  settings and click apply or ok. Future versions will include more comprehensive opti%0a> ons%3cbr>%0a> %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/theora_properties.JPG" alt="Select encoding%0a>  parameters.">%0a> %3cbr>%0a> %3cbr>%0a> %0a> %3cu>%3cb>Step 9 - Select Mux Filter%3c/b>%3c/u>%3cbr>%0a> Select the Ogg Mux filter as you previously did for the encoders and connect the encoders to it%0a> . As you connect a pin a new one will be spawned.%3cbr>%0a> Important: Whichever encoder is connected at *the bottom* is one that will appear *first* in th%0a> e encoded file. %3cb>This means to make a valid theora file, the vorbis stream is added first to %0a> the top pin, then the theora stream to the next pin.%3c/b>%3cbr>%0a> %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/select_muxer.JPG" alt="Select Muxer.">%0a> %3cbr>%0a> %3cbr>%0a> %0a> %3cu>%3cb>Step 10 - Fully connected graph to play%3c/b>%3c/u>%3cbr>%0a> The graph is now ready to go, and should look s
 omething like this. Press the play button and wa%0a> it for the encoding to finish. It is finished when the play button goes green again. Close grap%0a> hedit... don't press play again or it will overwrite the file. Depending on the source format i%0a> t may show encoding progress in the progress bar, this is however slightly innacurate... the ba%0a> r will appear to finish before the encoding has really finished. The progress bar indicates how%0a>  much data has left the source. Look at the play button or check your processor to usage to see%0a>  if it has finished.There will always be one empty pin at the bottom of the muxer, this is norm%0a> al.%3cbr>%0a> %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/fully_connected.JPG" alt="Fully Connected g%0a> raph">%0a> %3cbr>%0a\ No newline at end of file%0a
+host:1209339464=::1
+author:1209338935=silvia
+csum:1209338935=fixed step 1b
+diff:1209338935:1209313799:=14,15c14,16%0a%3c %0a%3c '''Step 1b - Rendered Graph'''%0a---%0a> xxx%0a> %0a> %3cu>%3cb>Step 1b - Rendered Graph%3c/b>%3c/u>%3cbr>%0a17,20c18,22%0a%3c s. The exact filters will depends on your source file.%0a%3c http://localhost/~silvia/oggdsf/uploads/images/show_rendered_graph.JPG"This is the r%0a%3c endered graph"%0a%3c %0a---%0a> s. The exact filters will depends on your source file.%3cbr>%0a> %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/show_rendered_graph.JPG" alt="This is the r%0a> endered graph">%0a> %3cbr>%0a> %3cbr>%0a
+host:1209338935=::1
+author:1209313799=silvia
+diff:1209313799:1209313683:minor=12c12%0a%3c http://localhost/~silvia/oggdsf/uploads/images/select_render_file.JPG%0a---%0a> http://localhost/~silvia/oggdsf/images/select_render_file.JPG%0a
+host:1209313799=::1
+author:1209313683=silvia
+csum:1209313683=started page - got tired - fix some other time
+diff:1209313683:1209313683:=1,116d0%0a%3c !! How to encode theora files with directshow%0a%3c %0a%3c If you have come to this page from an external site, please note before following these steps you need to install the [[Main/HomePage | directshow filters]] on my main page.%0a%3c %0a%3c This brief tutorial explains how to use the directshow filter in association with graphedit to encode or transcode ogg theora. It focuses mainly on transcoding, but by using different source filters you can also encode raw data.%0a%3c %0a%3c Graphedit is available in the DirectX9 SDK.%0a%3c %0a%3c %0a%3c '''Step 1a - Load File'''%0a%3c After loading up graphedit, from the file menu choose "Render Media File..." and browse to select the file you want to transcode.%0a%3c http://localhost/~silvia/oggdsf/images/select_render_file.JPG%0a%3c %0a%3c xxx%0a%3c %0a%3c %3cu>%3cb>Step 1b - Rendered Graph%3c/b>%3c/u>%3cbr>%0a%3c If it was successful, you should now have a fully rendered graph, that looks
  something like thi%0a%3c s. The exact filters will depends on your source file.%3cbr>%0a%3c %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/show_rendered_graph.JPG" alt="This is the r%0a%3c endered graph">%0a%3c %3cbr>%0a%3c %3cbr>%0a%3c %0a%3c %3cu>%3cb>Step 2a - Check media types%3c/b>%3c/u>%3cbr>%0a%3c Right click on the pin that inputs to the video renderer, and choose pin properties.%3cbr>%0a%3c %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/pin_properties.JPG" alt="Select pin proeprt%0a%3c ies">%0a%3c %3cbr>%0a%3c %3cbr>%0a%3c %0a%3c %0a%3c %3cu>%3cb>Step 2b - Ensure YV12 or YUY2%3c/b>%3c/u>%3cbr>%0a%3c On the pin properties page check the media type is either YV12 or YUY2, if it is not, this file%0a%3c  can not yet be transcoded directly. If it is then proceed.%3cbr>%0a%3c %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/ensure_YV12.JPG" alt="Select pin properties%0a%3c ">%0a%3c %0a%3c %3cu>%3cb>Step 3 - Remove renderers%3c/b>%3c/u>%3cbr>%0a%3
 c This has rendered a graph for playback, what we want to do is remove the renderers from the gra%0a%3c ph, and replace them with our encoders and muxer. To remove the renderers click on them, they w%0a%3c ill get a blue border, then press the delete key. After removing the renderers, the graph shoul%0a%3c d look something like this.%3cbr>%0a%3c %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/remove_renderers.JPG" alt="This is the rend%0a%3c ered graph">%0a%3c %3cbr>%0a%3c %3cbr>%0a%3c %0a%3c %0a%3c %3cu>%3cb>Step 4 - Find encoders%3c/b>%3c/u>%3cbr>%0a%3c The first time you will need to find the encoders, by clicking the add filter icon, then select%0a%3c ing the directshow branch of the tree.%3cbr>%0a%3c %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/find_encoders.JPG" alt="Find the encoders">%0a%3c %3cbr>%0a%3c %3cbr>%0a%3c %0a%3c %3cu>%3cb>Step 5a - Select encoders%3c/b>%3c/u>%3cbr>%0a%3c Find the vorbis encode filter and the theora encode filter, select 
 each one and check the favou%0a%3c rite filter box so next time the filter will be under favourites in the menu, click insert filt%0a%3c er.%3cbr>%0a%3c %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/select_encoders.JPG" alt="Select the encode%0a%3c rs">%0a%3c %3cbr>%0a%3c %3cbr>%0a%3c %0a%3c %3cu>%3cb>Step 5b - Encoders Added to graph%3c/b>%3c/u>%3cbr>%0a%3c After the encoders have been added to the graph, it should look something like this.%3cbr>%0a%3c %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/encoders_added.JPG" alt="Graph after encode%0a%3c rs added.">%0a%3c %3cbr>%0a%3c %3cbr>%0a%3c %0a%3c %3cu>%3cb>Step 6 - Connect the encoders%3c/b>%3c/u>%3cbr>%0a%3c By dragging the ouput pin of the decoder to the input of the encoder connect the filters togeth%0a%3c er.%3cbr>%0a%3c %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/connect_encoders.JPG" alt="Connecting encod%0a%3c er pins.">%0a%3c %0a%3c %0a%3c %3cu>%3cb>Step 7 - Open the Theora Encoder Pr
 operties%3c/b>%3c/u>%3cbr>%0a%3c Important: *BEFORE* connecting to the muxer, right click the filter and select it's proeprty pa%0a%3c ge.%3cbr>%0a%3c %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/filter_properties.JPG" alt="Selecting filte%0a%3c r proeprties menu item.">%0a%3c %3cbr>%0a%3c %3cbr>%0a%3c %0a%3c %3cu>%3cb>Step 8 - Setup the encoder properties%3c/b>%3c/u>%3cbr>%0a%3c Modify the settings and click apply or ok. Future versions will include more comprehensive opti%0a%3c ons%3cbr>%0a%3c %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/theora_properties.JPG" alt="Select encoding%0a%3c  parameters.">%0a%3c %3cbr>%0a%3c %3cbr>%0a%3c %0a%3c %3cu>%3cb>Step 9 - Select Mux Filter%3c/b>%3c/u>%3cbr>%0a%3c Select the Ogg Mux filter as you previously did for the encoders and connect the encoders to it%0a%3c . As you connect a pin a new one will be spawned.%3cbr>%0a%3c Important: Whichever encoder is connected at *the bottom* is one that will appear *first* in
  th%0a%3c e encoded file. %3cb>This means to make a valid theora file, the vorbis stream is added first to %0a%3c the top pin, then the theora stream to the next pin.%3c/b>%3cbr>%0a%3c %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/select_muxer.JPG" alt="Select Muxer.">%0a%3c %3cbr>%0a%3c %3cbr>%0a%3c %0a%3c %3cu>%3cb>Step 10 - Fully connected graph to play%3c/b>%3c/u>%3cbr>%0a%3c The graph is now ready to go, and should look something like this. Press the play button and wa%0a%3c it for the encoding to finish. It is finished when the play button goes green again. Close grap%0a%3c hedit... don't press play again or it will overwrite the file. Depending on the source format i%0a%3c t may show encoding progress in the progress bar, this is however slightly innacurate... the ba%0a%3c r will appear to finish before the encoding has really finished. The progress bar indicates how%0a%3c  much data has left the source. Look at the play button or check your processor to usa
 ge to see%0a%3c  if it has finished.There will always be one empty pin at the bottom of the muxer, this is norm%0a%3c al.%3cbr>%0a%3c %3cbr>%3cimg src="http://www.illiminable.com/ogg/images/fully_connected.JPG" alt="Fully Connected g%0a%3c raph">%0a%3c %3cbr>%0a\ No newline at end of file%0a
+host:1209313683=::1

Added: trunk/oggdsf/website/wiki.d/Main.Graphedit
===================================================================
--- trunk/oggdsf/website/wiki.d/Main.Graphedit	                        (rev 0)
+++ trunk/oggdsf/website/wiki.d/Main.Graphedit	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,16 @@
+version=pmwiki-2.2.0-beta65 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-GB; rv:1.9b5) Gecko/2008032619 Firefox/3.0b5
+author=silvia
+charset=ISO-8859-1
+csum=added Zen's original text
+ctime=1209313443
+host=::1
+name=Main.Graphedit
+rev=1
+targets=
+text=!! Some sample encoding directshow graphs in graphedit%0a%0ahttp://localhost/~silvia/oggdsf/uploads/images/wave_to_vorbis_graphedit.JPG"Vorbis Encoding" | Wave to vorbis encoding. (Visit [[http://www.waixwave.com/index.php | WaixWave]])%0a%0a%0ahttp://localhost/~silvia/oggdsf/uploads/images/mp3_to_vorbis_graphedit.JPG"Vorbis Graphedit" | [=MP3=] to vorbis transcoding.%0a%0a%0ahttp://localhost/~silvia/oggdsf/uploads/images/ogg_split_graphedit.JPG"Split Graphedit" | Splitting a theora+vorbis file to component parts. (File : [[http://www.polycrystal.org/lego/movies.html | Lego Man Movies]])%0a%0a%0ahttp://localhost/~silvia/oggdsf/uploads/images/wma_to_vorbis_graphedit.JPG"Wma to vorbis" | WMA to vorbis transcoding.%0a%0a%0a%0ahttp://localhost/~silvia/oggdsf/uploads/images/mp3_to_speex_graphedit.JPG"[=MP3=] to Speex" | [=MP3=] to speex transcoding.%0a%0a%0a%0ahttp://localhost/~silvia/oggdsf/uploads/images/vorbis_to_mp3_graphedit.JPG"Vorbis to [=MP3=]" | Vorbis to [=MP3=] tr
 anscoding.
+time=1209313443
+author:1209313443=silvia
+csum:1209313443=added Zen's original text
+diff:1209313443:1209313443:=1,20d0%0a%3c !! Some sample encoding directshow graphs in graphedit%0a%3c %0a%3c http://localhost/~silvia/oggdsf/uploads/images/wave_to_vorbis_graphedit.JPG"Vorbis Encoding" | Wave to vorbis encoding. (Visit [[http://www.waixwave.com/index.php | WaixWave]])%0a%3c %0a%3c %0a%3c http://localhost/~silvia/oggdsf/uploads/images/mp3_to_vorbis_graphedit.JPG"Vorbis Graphedit" | [=MP3=] to vorbis transcoding.%0a%3c %0a%3c %0a%3c http://localhost/~silvia/oggdsf/uploads/images/ogg_split_graphedit.JPG"Split Graphedit" | Splitting a theora+vorbis file to component parts. (File : [[http://www.polycrystal.org/lego/movies.html | Lego Man Movies]])%0a%3c %0a%3c %0a%3c http://localhost/~silvia/oggdsf/uploads/images/wma_to_vorbis_graphedit.JPG"Wma to vorbis" | WMA to vorbis transcoding.%0a%3c %0a%3c %0a%3c %0a%3c http://localhost/~silvia/oggdsf/uploads/images/mp3_to_speex_graphedit.JPG"[=MP3=] to Speex" | [=MP3=] to speex transcoding.%0a%3c %0a%3c %0a%3c %0a%3c http
 ://localhost/~silvia/oggdsf/uploads/images/vorbis_to_mp3_graphedit.JPG"Vorbis to [=MP3=]" | Vorbis to [=MP3=] transcoding.%0a\ No newline at end of file%0a
+host:1209313443=::1

Added: trunk/oggdsf/website/wiki.d/Main.History
===================================================================
--- trunk/oggdsf/website/wiki.d/Main.History	                        (rev 0)
+++ trunk/oggdsf/website/wiki.d/Main.History	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,32 @@
+version=pmwiki-2.2.0-beta65 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-GB; rv:1.9b5) Gecko/2008032619 Firefox/3.0b5
+author=silvia
+charset=ISO-8859-1
+csum=
+ctime=1209311124
+host=::1
+name=Main.History
+rev=6
+targets=Main.Downloads,Main.History,Main.About
+text=!! How it started...%0a%0aThe Ogg Directshow Filters were written by Zen Kavanagh from Perth, Australia. Zen handed over maintenance of the filters to Cristian Adam in April 2008.%0a%0aHere is what Zen wrote about the history of the Directshow Filters:%0a%0aI first began working on ogg media directshow filters whilst under contract to CSIRO's [[http://www.annodex.net | annodex.net]] project group. Much of the knowledge I needed to write these filters was gained through my work with this project. My initial implementation was for a specific annodex (which uses the ogg encapsulation format) demuxer. Part of my aim of this project was to use the knowledge gained to create a set of filters that works with generic ogg physical streams rather than just a particular physical bitstream format and to release these back to the open source community. There were several limitations to the approach taken to the original annodex filters which is why I decided to start from scratch to
  design the filter architecture over again with the experience of the first attempt.%0a%0aAnother of my aims of this project is to rewrite the annodex demuxer to use this new design in order for it to be more extensible and easier to work with. This time writing the generic ogg case first and then basing the annodex demuxer on this new design it will increase the consistency of the code between the two modules and provide less trouble integrating new codecs, with the aim of making annodex technology available in the standard applications that come default with windows.%0a%0aI encourage you all to go and check out the [[http://www.annodex.net | annodex project]] and to consider coding some applications to utilise this new technology. There are many interesting possibilities this new technology presents to continuous media and search technology which will expand the internet to be a richer more dynamic multimedia experience.%0a%0aThankyou to CSIRO's annodex.net project group (
 Silvia Pfeiffer, Conrad Parker and Andre Pang) for the opportunity to work on this exciting new technology and sparking my interest in directshow and the [[http://xiph.org | xiph.org]] range of codecs.%0a%0aOn the 1st of May 2004, this project began to be maintained in the [[http://www.xiph.org | xiph.org]] subversion repository. It can be found at [[http://svn.xiph.org/trunk/oggdsf/ | svn.xiph.org/trunk/oggdsf/]]%0a%0a%0a%0a!! Previous Versions%0a%0aOnly download these if you have problems with the [[Main/Downloads | new version]]. Versions older than 2005 have been removed.%0a%0a%0a!! Previous Version (0.70.0827) - 16/02/2006%0a%0aWow... has it been a whole year :) Yes, this project is still alive! There's a fair bit of new code, so if you have problems you might want to try the [[Main/History | history]] page and get version 0.69. One notable thing that this new version does not do correctly, is it no longer handles chained icecast streams, but it handles streaming static
  files on a server much better. The previous solution for icecast was a real hack which is no longer possible, it will be fixed properly fairly soon.%0a%0aI'm releasing now, because otherwise you'll be waiting forever! Releases should be coming much more frequently hopefully. As always, email me your bugs and feature requests. The unicode filenames will be fixed as soon as I can, sorry, I keep putting that one off.%0a%0a!!![[(Attach:)oggcodecs_0.70.0827.exe | Download Now (824,581 bytes)]]%0a%0a%0a!!! Changes this version%0a%0a* Theora can seek without artefacts to any frame, even non-keyframes.(95%25 of the time, there's still a slight bug)%0a* All seeking in all codecs is accurate to within a single audio sample (ie. sub-second)%0a* Complete rewrite of demux, it's much easier for me to continue now.%0a* OGM support is improved a bit, still not great. It does not associate with the .ogm extension to avoid messing with other solutions for .ogm you might have. But renaming th
 e .ogm file to .ogg it will attempt to play it.%0a* Improved handling of static files on servers (still not seeking over http)%0a* Be aware that it builds a seektable for all on-disk files. For really large files (>250MB) it may take a little while for the file to load.%0a* Updated most libraries, vorbis is still at 1.1.1, speex still 1.1.10. Another release soonish may rectify this. I just want to release what I've got now, or it will keep being put off.%0a%0a%0a%0a!! Previous Version (0.69.8924) - 15/02/2005%0a%0aLots of bufixes, especially memory leaks and memory management. Along with a new installer based on [[http://nsis.sourceforge.net/ | NSIS]], which is just click-and-run.%0a%0a%0a!!![[(Attach:)oggcodecs_0.69.8924.exe | Download Now (816,782 bytes)]]%0a%0a%0a!!! Changes this version%0a%0a* Removed several major memory leaks in encoders and decoders%0a* More intelligent buffer sizing, reduces memory footprint about 5-10 fold%0a* Much more [[http://localhost/~silvia/o
 ggdsf/uploads/docs/ | documentation]]%0a* Vorbis encoder has programmatic interface for setting quality%0a* Annodex Muxing support%0a* Programmitic interface for encoding progress%0a* Can seek in [=WMP6.4=]%0a* Several other tools (not included in this binary) for server side seeking, and .NET media players added to [[Main/About | SDK]]%0a%0a
+time=1209340846
+author:1209340846=silvia
+diff:1209340846:1209340794:minor=47c47,48%0a%3c Lots of bufixes, especially memory leaks and memory management. Along with a new installer based on [[http://nsis.sourceforge.net/ | NSIS]], which is just click-and-run.%0a---%0a> Lots of bufixes, especially memory leaks and memory management. Along with a new installer base%0a> d on [[http://nsis.sourceforge.net/ | NSIS]], which is just click-and-run.%0a
+host:1209340846=::1
+author:1209340794=silvia
+diff:1209340794:1209340693:minor=62,63c62,63%0a%3c * Can seek in [=WMP6.4=]%0a%3c * Several other tools (not included in this binary) for server side seeking, and .NET media players added to [[Main/About | SDK]]%0a---%0a> * Can seek in WMP6.4%0a> * Several other tools (not included in this binary) for server side seeking, and .NET media players added to [[Main/AboutSDK | SDK]]%0a
+host:1209340794=::1
+author:1209340693=silvia
+csum:1209340693=added documentation link
+diff:1209340693:1209312157:=58c58%0a%3c * Much more [[http://localhost/~silvia/oggdsf/uploads/docs/ | documentation]]%0a---%0a> * Much more [[Main/Doc | documentation]]%0a
+host:1209340693=::1
+author:1209312157=silvia
+diff:1209312157:1209311193:minor=57c57%0a%3c * More intelligent buffer sizing, reduces memory footprint about 5-10 fold%0a---%0a> * More intelligent buffer sizing, reduces memory footprint about about 5-10 fold%0a
+host:1209312157=::1
+author:1209311193=silvia
+diff:1209311193:1209311124:minor=24,25c24,25%0a%3c !! Previous Version (0.70.0827) - 16/02/2006%0a%3c %0a---%0a> !!! Previous Version (0.70.0827) - 16/02/2006%0a> %0a45c45%0a%3c !! Previous Version (0.69.8924) - 15/02/2005%0a---%0a> !!! Previous Version (0.69.8924) - 15/02/2005%0a
+host:1209311193=::1
+author:1209311124=silvia
+csum:1209311124=started page
+diff:1209311124:1209311124:=1,64d0%0a%3c !! How it started...%0a%3c %0a%3c The Ogg Directshow Filters were written by Zen Kavanagh from Perth, Australia. Zen handed over maintenance of the filters to Cristian Adam in April 2008.%0a%3c %0a%3c Here is what Zen wrote about the history of the Directshow Filters:%0a%3c %0a%3c I first began working on ogg media directshow filters whilst under contract to CSIRO's [[http://www.annodex.net | annodex.net]] project group. Much of the knowledge I needed to write these filters was gained through my work with this project. My initial implementation was for a specific annodex (which uses the ogg encapsulation format) demuxer. Part of my aim of this project was to use the knowledge gained to create a set of filters that works with generic ogg physical streams rather than just a particular physical bitstream format and to release these back to the open source community. There were several limitations to the approach taken to the original ann
 odex filters which is why I decided to start from scratch to design the filter architecture over again with the experience of the first attempt.%0a%3c %0a%3c Another of my aims of this project is to rewrite the annodex demuxer to use this new design in order for it to be more extensible and easier to work with. This time writing the generic ogg case first and then basing the annodex demuxer on this new design it will increase the consistency of the code between the two modules and provide less trouble integrating new codecs, with the aim of making annodex technology available in the standard applications that come default with windows.%0a%3c %0a%3c I encourage you all to go and check out the [[http://www.annodex.net | annodex project]] and to consider coding some applications to utilise this new technology. There are many interesting possibilities this new technology presents to continuous media and search technology which will expand the internet to be a richer more dynamic
  multimedia experience.%0a%3c %0a%3c Thankyou to CSIRO's annodex.net project group (Silvia Pfeiffer, Conrad Parker and Andre Pang) for the opportunity to work on this exciting new technology and sparking my interest in directshow and the [[http://xiph.org | xiph.org]] range of codecs.%0a%3c %0a%3c On the 1st of May 2004, this project began to be maintained in the [[http://www.xiph.org | xiph.org]] subversion repository. It can be found at [[http://svn.xiph.org/trunk/oggdsf/ | svn.xiph.org/trunk/oggdsf/]]%0a%3c %0a%3c %0a%3c %0a%3c !! Previous Versions%0a%3c %0a%3c Only download these if you have problems with the [[Main/Downloads | new version]]. Versions older than 2005 have been removed.%0a%3c %0a%3c %0a%3c !!! Previous Version (0.70.0827) - 16/02/2006%0a%3c %0a%3c Wow... has it been a whole year :) Yes, this project is still alive! There's a fair bit of new code, so if you have problems you might want to try the [[Main/History | history]] page and get version 0.69. One no
 table thing that this new version does not do correctly, is it no longer handles chained icecast streams, but it handles streaming static files on a server much better. The previous solution for icecast was a real hack which is no longer possible, it will be fixed properly fairly soon.%0a%3c %0a%3c I'm releasing now, because otherwise you'll be waiting forever! Releases should be coming much more frequently hopefully. As always, email me your bugs and feature requests. The unicode filenames will be fixed as soon as I can, sorry, I keep putting that one off.%0a%3c %0a%3c !!![[(Attach:)oggcodecs_0.70.0827.exe | Download Now (824,581 bytes)]]%0a%3c %0a%3c %0a%3c !!! Changes this version%0a%3c %0a%3c * Theora can seek without artefacts to any frame, even non-keyframes.(95%25 of the time, there's still a slight bug)%0a%3c * All seeking in all codecs is accurate to within a single audio sample (ie. sub-second)%0a%3c * Complete rewrite of demux, it's much easier for me to continue 
 now.%0a%3c * OGM support is improved a bit, still not great. It does not associate with the .ogm extension to avoid messing with other solutions for .ogm you might have. But renaming the .ogm file to .ogg it will attempt to play it.%0a%3c * Improved handling of static files on servers (still not seeking over http)%0a%3c * Be aware that it builds a seektable for all on-disk files. For really large files (>250MB) it may take a little while for the file to load.%0a%3c * Updated most libraries, vorbis is still at 1.1.1, speex still 1.1.10. Another release soonish may rectify this. I just want to release what I've got now, or it will keep being put off.%0a%3c %0a%3c %0a%3c %0a%3c !!! Previous Version (0.69.8924) - 15/02/2005%0a%3c %0a%3c Lots of bufixes, especially memory leaks and memory management. Along with a new installer base%0a%3c d on [[http://nsis.sourceforge.net/ | NSIS]], which is just click-and-run.%0a%3c %0a%3c %0a%3c !!![[(Attach:)oggcodecs_0.69.8924.exe | Download 
 Now (816,782 bytes)]]%0a%3c %0a%3c %0a%3c !!! Changes this version%0a%3c %0a%3c * Removed several major memory leaks in encoders and decoders%0a%3c * More intelligent buffer sizing, reduces memory footprint about about 5-10 fold%0a%3c * Much more [[Main/Doc | documentation]]%0a%3c * Vorbis encoder has programmatic interface for setting quality%0a%3c * Annodex Muxing support%0a%3c * Programmitic interface for encoding progress%0a%3c * Can seek in WMP6.4%0a%3c * Several other tools (not included in this binary) for server side seeking, and .NET media players added to [[Main/AboutSDK | SDK]]%0a%3c %0a
+host:1209311124=::1

Added: trunk/oggdsf/website/wiki.d/Main.HomePage
===================================================================
--- trunk/oggdsf/website/wiki.d/Main.HomePage	                        (rev 0)
+++ trunk/oggdsf/website/wiki.d/Main.HomePage	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,40 @@
+version=pmwiki-2.2.0-beta65 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-GB; rv:1.9b5) Gecko/2008032619 Firefox/3.0b5
+author=silvia
+charset=ISO-8859-1
+csum=added API documentation link
+host=::1
+name=Main.HomePage
+rev=208
+targets=Main.Downloads,Main.Graphedit,Main.EncTheoraGraphedit,Main.History,Main.SseBuilds
+text=!! Installation%0a%0aFollow these steps:%0a%0a# Uninstall any previous version of these filters. ('''This is important!''') Go to add remove programs, remove oggcodecs.%0a# Make sure media player or any directshow applications are closed.%0a# Run the installer.%0a%0aThen Windows Media Player or any other directshow application (eg. [=BSPlayer=]) will be able to play Ogg Vorbis, Ogg Speex, Ogg Theora, Ogg FLAC and native FLAC.%0a%0aStarting with version 0.72.1838, development will now be split into a stable and unstable branch. That way, those who just want to play their files can get the stable version, and those who want to live dangerously can get the latest new features without having to wait for me to do proper testing. You can find the '''unstable builds''' on the [[Main/Downloads | download page]].%0a%0aMost users should download the stable version below.%0a%0a%0a!! Current Stable Version (0.71.0946) - 24/02/2006%0a%0aMore bugfixes, particularly to theora. See 0.7
 0 release for more details about recent changes. Docs and source package will be updated on the weekend, there's no major changes there from 0.70. This version is fairly stable now it seems.%0a%0aOgg Codecs for all versions of Windows:%0a%0a!!![[(Attach:)oggcodecs_0.71.0946.exe | Download Now (824,901 bytes)]]%0a%0a%0a!!! Changes this version%0a%0a* Fixed the theora seeking bug, should accurately seek to any frame without artefacts.%0a* Fixed bug not handling WMP doing hardware video acceleration, caused crash on some files (Thanks slashdot!)%0a* Fixed handling of missing 3xx http response codes%0a* Fixed bug where player would crash if you dragged it from one monitor to another while playing%0a* Fixed COM reference double-release bug%0a* Fixed race condition which could crash or hang sometimes after a seek.%0a%0a%0a!!! Known issues%0a%0a* Can't play file with names that use extended character sets (ie Japanese) under certain locales of windows (Thanks Liisachan)%0a* AVI Vid
 eo files encoded with non-integral framerates (ie 29.97) may lose sync, due to rounding bug (Thanks [=RadicalEd=])%0a* Make the installer properly detect if it's already installed. If you don't uninstall the old version you will get multiple identical file masks in WMP%0a* If you are getting codec problems, there appears to be a conflict with something in Media Player Classic... it tries to enforce the use of another ogg demultiplexer, either by design or accident.If you see in MPC it complaining about a media subtype with a GUID {[=CDDCA2D5-6D75-4F98-840E737BEDD5C63B=]}. This is the guid of the old tobias vorbis filter, and this one {[=8D2FD10B-5841-4a6b-8905-588FEC1ADED9=]} is [=CoreVorbis=]. This is most likely due to the fact that these filters don't clean up the registry when they uninstall. I am working on something to "clean up" all these remnants from the registry (don't expect it too soon though... it's not that high priority). You can also apparently an option to d
 isable the inbuilt demuxer (Thanks Bond)%0a* Cannot handle any chained multiplexed files or streams.%0a%0a%0a!! Other stuff%0a%0a* Also you can encode vorbis, speex, FLAC and theora files using graphedit ([[http://www.microsoft.com/downloads/details.aspx?FamilyID=9216652f-51e0-402e-b7b5-feb68d00f298&displaylang=en | DirectX9 SDK]]) or other similar program.%0a* [[Main/Graphedit | See audio encoding example filter graphs]]%0a* [[Main/EncTheoraGraphedit | Theora encoding how-to]]%0a* If you install [[http://sourceforge.net/projects/ffdshow | ffdshow ]], you will be able to play ogm files (sometimes at least!)%0a* Also, if you download, install and register [[http://sourceforge.net/project/showfiles.php?group_id=82303&package_id=84799 | Gabests .cda directshow source]] you can rip CD's using graphedit%0a* Looking for [[Main/History | old versions]] ?%0a* Want the [[(Attach:)oggcodecs_src_0.70.0827.zip | zipped source code]] (10.5 MB zipped, 37MB unzipped) ?%0a* Want to [[http:/
 /svn.xiph.org/trunk/oggdsf/ | browse the source on the web]]%0a* [[Main/SseBuilds | Experimental SSE/SSE2 builds can be found here]]%0a* Some basic [[http://localhost/~silvia/oggdsf/uploads/docs/ | API documentation]] for developers%0a
+time=1209340608
+author:1209340608=silvia
+csum:1209340608=added API documentation link
+diff:1209340608:1209308041:=55c55%0a%3c * Some basic [[http://localhost/~silvia/oggdsf/uploads/docs/ | API documentation]] for developers%0a---%0a> * Some basic [[Main/Docs | API documentation]] for developers%0a
+host:1209340608=::1
+author:1209308041=silvia
+diff:1209308041:1209308003:minor=5c5%0a%3c # Uninstall any previous version of these filters. ('''This is important!''') Go to add remove programs, remove oggcodecs.%0a---%0a> # Uninstall any previous version of these filters. ('''This is important!''') Go to add remove programs, remove oggcodecs%0a
+host:1209308041=::1
+author:1209308003=silvia
+diff:1209308003:1209307961:minor=3c3%0a%3c Follow these steps:%0a---%0a> Follow the following steps:%0a
+host:1209308003=::1
+author:1209307961=silvia
+diff:1209307961:1209307923:minor=22c22%0a%3c !!![[(Attach:)oggcodecs_0.71.0946.exe | Download Now (824,901 bytes)]]%0a---%0a> [[(Attach:)oggcodecs_0.71.0946.exe | Download Now (824,901 bytes)]]%0a
+host:1209307961=::1
+author:1209307923=silvia
+csum:1209307923=changes to some more links
+diff:1209307923:1209307688:=47,48c47,48%0a%3c * [[Main/Graphedit | See audio encoding example filter graphs]]%0a%3c * [[Main/EncTheoraGraphedit | Theora encoding how-to]]%0a---%0a> * [[http://www.illiminable.com/ogg/graphedit.html | See audio encoding example filter graphs]]%0a> * [[http://www.illiminable.com/ogg/enc_theora_graphedit.html | Theora encoding how-to]]%0a51,52c51,52%0a%3c * Looking for [[Main/History | old versions]] ?%0a%3c * Want the [[(Attach:)oggcodecs_src_0.70.0827.zip | zipped source code]] (10.5 MB zipped, 37MB unzipped) ?%0a---%0a> * Looking for [[http://www.illiminable.com/ogg/history.html | old versions]] ?%0a> * Want the [[http://www.illiminable.com/ogg/oggcodecs_src_0.70.0827.zip | zipped source code]] (10.5 MB zipped, 37MB unzipped) ?%0a54,55c54,55%0a%3c * [[Main/SseBuilds | Experimental SSE/SSE2 builds can be found here]]%0a%3c * Some basic [[Main/Docs | API documentation]] for developers%0a---%0a> * [[http://www.illiminable.com/ogg/sse_builds.html
  | Experimental SSE/SSE2 builds can be found here]]%0a> * Some basic [[http://www.illiminable.com/ogg/docs/index.html | API documentation]] for developers%0a
+host:1209307923=::1
+author:1209307688=silvia
+csum:1209307688=fixed links
+diff:1209307688:1209307351:=38c38%0a%3c * AVI Video files encoded with non-integral framerates (ie 29.97) may lose sync, due to rounding bug (Thanks [=RadicalEd=])%0a---%0a> * AVI Video files encoded with non-integral framerates (ie 29.97) may lose sync, due to rounding bug (Thanks RadicalEd)%0a40c40%0a%3c * If you are getting codec problems, there appears to be a conflict with something in Media Player Classic... it tries to enforce the use of another ogg demultiplexer, either by design or accident.If you see in MPC it complaining about a media subtype with a GUID {[=CDDCA2D5-6D75-4F98-840E737BEDD5C63B=]}. This is the guid of the old tobias vorbis filter, and this one {[=8D2FD10B-5841-4a6b-8905-588FEC1ADED9=]} is [=CoreVorbis=]. This is most likely due to the fact that these filters don't clean up the registry when they uninstall. I am working on something to "clean up" all these remnants from the registry (don't expect it too soon though... it's not that high priority). Yo
 u can also apparently an option to disable the inbuilt demuxer (Thanks Bond)%0a---%0a> * If you are getting codec problems, there appears to be a conflict with something in Media Player Classic... it tries to enforce the use of another ogg demultiplexer, either by design or accident.If you see in MPC it complaining about a media subtype with a GUID {CDDCA2D5-6D75-4F98-840E-737BEDD5C63B}. This is the guid of the old tobias vorbis filter, and this one {8D2FD10B-5841-4a6b-8905-588FEC1ADED9} is CoreVorbis. This is most likely due to the fact that these filters don't clean up the registry when they uninstall. I am working on something to "clean up" all these remnants from the registry (don't expect it too soon though... it's not that high priority). You can also apparently an option to disable the inbuilt demuxer (Thanks Bond)%0a46,55c46,56%0a%3c * Also you can encode vorbis, speex, FLAC and theora files using graphedit ([[http://www.microsoft.com/downloads/details.aspx?FamilyID=
 9216652f-51e0-402e-b7b5-feb68d00f298&displaylang=en | DirectX9 SDK]]) or other similar program.%0a%3c * [[http://www.illiminable.com/ogg/graphedit.html | See audio encoding example filter graphs]]%0a%3c * [[http://www.illiminable.com/ogg/enc_theora_graphedit.html | Theora encoding how-to]]%0a%3c * If you install [[http://sourceforge.net/projects/ffdshow | ffdshow ]], you will be able to play ogm files (sometimes at least!)%0a%3c * Also, if you download, install and register [[http://sourceforge.net/project/showfiles.php?group_id=82303&package_id=84799 | Gabests .cda directshow source]] you can rip CD's using graphedit%0a%3c * Looking for [[http://www.illiminable.com/ogg/history.html | old versions]] ?%0a%3c * Want the [[http://www.illiminable.com/ogg/oggcodecs_src_0.70.0827.zip | zipped source code]] (10.5 MB zipped, 37MB unzipped) ?%0a%3c * Want to [[http://svn.xiph.org/trunk/oggdsf/ | browse the source on the web]]%0a%3c * [[http://www.illiminable.com/ogg/sse_builds.html |
  Experimental SSE/SSE2 builds can be found here]]%0a%3c * Some basic [[http://www.illiminable.com/ogg/docs/index.html | API documentation]] for developers%0a---%0a> * Also you can encode vorbis, speex, FLAC and theora files using graphedit(%3ca href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9216652f-51e0-402e-b7b5-feb68d00f298&displaylang=en">DirectX9 SDK%3c/a>) or other similar program.%0a> * %3ca href="http://www.illiminable.com/ogg/graphedit.html">See audio encoding example filter g%0a> raphs%3c/a>%0a> * %3ca href="http://www.illiminable.com/ogg/enc_theora_graphedit.html">Theora encoding how-to%3c/a>%0a> * If you install %3ca href="http://sourceforge.net/projects/ffdshow">ffdshow%3c/a>, you will be able to play ogm files (sometimes at least!)%0a> * Also, if you download, install and register %3ca href="http://sourceforge.net/project/showfiles.php?group_id=82303&package_id=84799">Gabests .cda directshow source%3c/a> you can rip CD's using graphedit%0a> * Lo
 oking for %3ca href="http://www.illiminable.com/ogg/history.html">old versions%3c/a> ?%0a> * Want the %3ca href="http://www.illiminable.com/ogg/oggcodecs_src_0.70.0827.zip">zipped source code%3c/a> (10.5 MB zipped, 37MB unzipped) ?%0a> * Want to %3ca href="http://svn.xiph.org/trunk/oggdsf/">browse the source on the web%3c/a>%0a> * %3ca href="http://www.illiminable.com/ogg/sse_builds.html">Experimental SSE/SSE2 builds can be found here%3c/a>%0a> * Some basic %3ca href="http://www.illiminable.com/ogg/docs/index.html">API documentation%3c/a> for developers%0a
+host:1209307688=::1
+author:1209307351=silvia
+csum:1209307351=numbering instead of list
+diff:1209307351:1209307040:=3,9c3,7%0a%3c Follow the following steps:%0a%3c %0a%3c # Uninstall any previous version of these filters. ('''This is important!''') Go to add remove programs, remove oggcodecs%0a%3c # Make sure media player or any directshow applications are closed.%0a%3c # Run the installer.%0a%3c %0a%3c Then Windows Media Player or any other directshow application (eg. [=BSPlayer=]) will be able to play Ogg Vorbis, Ogg Speex, Ogg Theora, Ogg FLAC and native FLAC.%0a---%0a> * Uninstall any previous version of these filters.('''This is important!''') Go to add remove programs, remove oggcodecs%0a> * Make sure media player or any directshow applications are closed.%0a> * Run the installer.%0a> %0a> Then Windows Media Player or any other directshow application (eg. BSPlayer) will be able to play Ogg Vorbis, Ogg Speex, Ogg Theora, Ogg FLAC and native FLAC.%0a
+host:1209307351=::1
+author:1209307040=silvia
+csum:1209307040=added Zen's original text
+diff:1209307040:1142203034:=1,54c1,12%0a%3c !! Installation%0a%3c %0a%3c * Uninstall any previous version of these filters.('''This is important!''') Go to add remove programs, remove oggcodecs%0a%3c * Make sure media player or any directshow applications are closed.%0a%3c * Run the installer.%0a%3c %0a%3c Then Windows Media Player or any other directshow application (eg. BSPlayer) will be able to play Ogg Vorbis, Ogg Speex, Ogg Theora, Ogg FLAC and native FLAC.%0a%3c %0a%3c Starting with version 0.72.1838, development will now be split into a stable and unstable branch. That way, those who just want to play their files can get the stable version, and those who want to live dangerously can get the latest new features without having to wait for me to do proper testing. You can find the '''unstable builds''' on the [[Main/Downloads | download page]].%0a%3c %0a%3c Most users should download the stable version below.%0a%3c %0a%3c %0a%3c !! Current Stable Version (0.71.0946) - 24
 /02/2006%0a%3c %0a%3c More bugfixes, particularly to theora. See 0.70 release for more details about recent changes. Docs and source package will be updated on the weekend, there's no major changes there from 0.70. This version is fairly stable now it seems.%0a%3c %0a%3c Ogg Codecs for all versions of Windows:%0a%3c %0a%3c [[(Attach:)oggcodecs_0.71.0946.exe | Download Now (824,901 bytes)]]%0a%3c %0a%3c %0a%3c !!! Changes this version%0a%3c %0a%3c * Fixed the theora seeking bug, should accurately seek to any frame without artefacts.%0a%3c * Fixed bug not handling WMP doing hardware video acceleration, caused crash on some files (Thanks slashdot!)%0a%3c * Fixed handling of missing 3xx http response codes%0a%3c * Fixed bug where player would crash if you dragged it from one monitor to another while playing%0a%3c * Fixed COM reference double-release bug%0a%3c * Fixed race condition which could crash or hang sometimes after a seek.%0a%3c %0a%3c %0a%3c !!! Known issues%0a%3c %0a%3
 c * Can't play file with names that use extended character sets (ie Japanese) under certain locales of windows (Thanks Liisachan)%0a%3c * AVI Video files encoded with non-integral framerates (ie 29.97) may lose sync, due to rounding bug (Thanks RadicalEd)%0a%3c * Make the installer properly detect if it's already installed. If you don't uninstall the old version you will get multiple identical file masks in WMP%0a%3c * If you are getting codec problems, there appears to be a conflict with something in Media Player Classic... it tries to enforce the use of another ogg demultiplexer, either by design or accident.If you see in MPC it complaining about a media subtype with a GUID {CDDCA2D5-6D75-4F98-840E-737BEDD5C63B}. This is the guid of the old tobias vorbis filter, and this one {8D2FD10B-5841-4a6b-8905-588FEC1ADED9} is CoreVorbis. This is most likely due to the fact that these filters don't clean up the registry when they uninstall. I am working on something to "clean up" all
  these remnants from the registry (don't expect it too soon though... it's not that high priority). You can also apparently an option to disable the inbuilt demuxer (Thanks Bond)%0a%3c * Cannot handle any chained multiplexed files or streams.%0a%3c %0a%3c %0a%3c !! Other stuff%0a%3c %0a%3c * Also you can encode vorbis, speex, FLAC and theora files using graphedit(%3ca href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9216652f-51e0-402e-b7b5-feb68d00f298&displaylang=en">DirectX9 SDK%3c/a>) or other similar program.%0a%3c * %3ca href="http://www.illiminable.com/ogg/graphedit.html">See audio encoding example filter g%0a%3c raphs%3c/a>%0a%3c * %3ca href="http://www.illiminable.com/ogg/enc_theora_graphedit.html">Theora encoding how-to%3c/a>%0a%3c * If you install %3ca href="http://sourceforge.net/projects/ffdshow">ffdshow%3c/a>, you will be able to play ogm files (sometimes at least!)%0a%3c * Also, if you download, install and register %3ca href="http://sourceforge.n
 et/project/showfiles.php?group_id=82303&package_id=84799">Gabests .cda directshow source%3c/a> you can rip CD's using graphedit%0a%3c * Looking for %3ca href="http://www.illiminable.com/ogg/history.html">old versions%3c/a> ?%0a%3c * Want the %3ca href="http://www.illiminable.com/ogg/oggcodecs_src_0.70.0827.zip">zipped source code%3c/a> (10.5 MB zipped, 37MB unzipped) ?%0a%3c * Want to %3ca href="http://svn.xiph.org/trunk/oggdsf/">browse the source on the web%3c/a>%0a%3c * %3ca href="http://www.illiminable.com/ogg/sse_builds.html">Experimental SSE/SSE2 builds can be found here%3c/a>%0a%3c * Some basic %3ca href="http://www.illiminable.com/ogg/docs/index.html">API documentation%3c/a> for developers%0a---%0a> Welcome to PmWiki!%0a> %0a> A local copy of PmWiki's%0a> documentation has been installed along with the software,%0a> and is available via the [[PmWiki/documentation index]].  %0a> %0a> To continue setting up PmWiki, see [[PmWiki/initial setup tasks]].%0a> %0a> The [[PmWi
 ki/basic editing]] page describes how to create pages%0a> in PmWiki.  You can practice editing in the [[wiki sandbox]].%0a> %0a> More information about PmWiki is available from http://www.pmwiki.org .%0a
+host:1209307040=::1

Added: trunk/oggdsf/website/wiki.d/Main.RecentChanges
===================================================================
--- trunk/oggdsf/website/wiki.d/Main.RecentChanges	                        (rev 0)
+++ trunk/oggdsf/website/wiki.d/Main.RecentChanges	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,8 @@
+version=pmwiki-2.2.0-beta65 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-GB; rv:1.9b5) Gecko/2008032619 Firefox/3.0b5
+ctime=1209307040
+host=::1
+name=Main.RecentChanges
+rev=31
+text=* [[Main/History]]  . . . April 28, 2008, at 10:00 AM by [[~silvia]]: [==]%0a* [[Main/HomePage]]  . . . April 28, 2008, at 09:56 AM by [[~silvia]]: [=added API documentation link=]%0a* [[Main/SseBuilds]]  . . . April 28, 2008, at 09:53 AM by [[~silvia]]: [==]%0a* [[Main/EncTheoraGraphedit]]  . . . April 28, 2008, at 09:40 AM by [[~silvia]]: [==]%0a* [[Main/Graphedit]]  . . . April 28, 2008, at 02:24 AM by [[~silvia]]: [=added Zen's original text=]%0a* [[Main/About]]  . . . April 28, 2008, at 01:53 AM by [[~silvia]]: [==]%0a* [[Main/DeveloperInfo]]  . . . April 28, 2008, at 01:27 AM by [[~silvia]]: [=original Zen's page=]%0a* [[Main/Downloads]]  . . . April 28, 2008, at 01:19 AM by [[~silvia]]: [==]%0a
+time=1209340846

Added: trunk/oggdsf/website/wiki.d/Main.SseBuilds
===================================================================
--- trunk/oggdsf/website/wiki.d/Main.SseBuilds	                        (rev 0)
+++ trunk/oggdsf/website/wiki.d/Main.SseBuilds	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,25 @@
+version=pmwiki-2.2.0-beta65 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-GB; rv:1.9b5) Gecko/2008032619 Firefox/3.0b5
+author=silvia
+charset=ISO-8859-1
+csum=
+ctime=1209340206
+host=::1
+name=Main.SseBuilds
+rev=4
+targets=Main.HomePage
+text=!! [=SSE/SSE2=] Experimental Builds of Directshow Filters for Ogg Vorbis, Speex, Theora and FLAC%0a%0aThese are experimental builds only... if you have any doubt about whether your processor supports these, download the official release from the [[Main/HomePage | main page]].%0a%0aThese builds are specific to [=SSE=] and [=SSE2=] compatible processors. If you run these on the wrong processor they will crash the program and maybe even your system. If in doubt don't use them !%0a%0a[=SSE2=] instructions are for Pentium 4's. [=SSE=] instructions are for some Pentium 3's and Athlon XP's. None of the old athlons support them. Also note, I only have Athlons, so I haven't tested the [=SSE2=] builds at all. If you use these and they work, I'd appreciate if you let me know. I have found about a 15%25 improvement in encode speed using the [=SSE=] builds on my machine. If you do some testing on your machine let me know. Uninstall the normal/previous version before installing these
 .%0a%0a%0a%0a!! Current Version  0.68.8333 - 06/12/2004%0a%0aMainly bugfixes.%0a%0a!!![[(Attach:)oggcodecs_SSE_0.68.8333.zip | Download Now (992,504 bytes) - SSE enabled processors only]]%0a%0a%0a!!![[(Attach:)oggcodecs_SSE2_0.68.8333.zip | Download Now (985,275 bytes) - SSE2 enabled processors only]]%0a%0a%0a!!! Changes this version%0a%0a* Fixed playback from windows network drives.%0a* Fixed bug where audio would stop if you seek really close to the end.%0a* Seeking performance back to almost instant%0a
+time=1209340433
+author:1209340433=silvia
+diff:1209340433:1209340416:minor=7c7%0a%3c [=SSE2=] instructions are for Pentium 4's. [=SSE=] instructions are for some Pentium 3's and Athlon XP's. None of the old athlons support them. Also note, I only have Athlons, so I haven't tested the [=SSE2=] builds at all. If you use these and they work, I'd appreciate if you let me know. I have found about a 15%25 improvement in encode speed using the [=SSE=] builds on my machine. If you do some testing on your machine let me know. Uninstall the normal/previous version before installing these.%0a---%0a> [=SSE2=] instructions are for Pentium 4's. [=SSE=] instructions are for some Pentium 3's and Athlon XP's. None of the old athlons support them. Also note, I only have Athlons, so I haven't tested the SSE2 builds at all. If you use these and they work, I'd appreciate if you let me know. I have found about a 15%25 improvement in encode speed using the [=SSE=] builds on my machine. If you do some testing on your machine let me know. U
 ninstall the normal/previous version before installing these.%0a
+host:1209340433=::1
+author:1209340416=silvia
+diff:1209340416:1209340385:minor=7c7%0a%3c [=SSE2=] instructions are for Pentium 4's. [=SSE=] instructions are for some Pentium 3's and Athlon XP's. None of the old athlons support them. Also note, I only have Athlons, so I haven't tested the SSE2 builds at all. If you use these and they work, I'd appreciate if you let me know. I have found about a 15%25 improvement in encode speed using the [=SSE=] builds on my machine. If you do some testing on your machine let me know. Uninstall the normal/previous version before installing these.%0a---%0a> SSE2 instructions are for Pentium 4's. [=SSE=] instructions are for some Pentium 3's and Athlon XP's. None of the old athlons support them. Also note, I only have Athlons, so I haven't tested the SSE2 builds at all. If you use these and they work, I'd appreciate if you let me know. I have found about a 15%25 improvement in encode speed using the SSE builds on my machine. If you do some testing on your machine let me know. Uninstall the
  normal/previous version before installing these.%0a
+host:1209340416=::1
+author:1209340385=silvia
+diff:1209340385:1209340206:minor=1,2c1,2%0a%3c !! [=SSE/SSE2=] Experimental Builds of Directshow Filters for Ogg Vorbis, Speex, Theora and FLAC%0a%3c %0a---%0a> !! SSE/SSE2 Experimental Builds of Directshow Filters for Ogg Vorbis, Speex, Theora and FLAC%0a> %0a5,10c5,10%0a%3c These builds are specific to [=SSE=] and [=SSE2=] compatible processors. If you run these on the wrong processor they will crash the program and maybe even your system. If in doubt don't use them !%0a%3c %0a%3c SSE2 instructions are for Pentium 4's. [=SSE=] instructions are for some Pentium 3's and Athlon XP's. None of the old athlons support them. Also note, I only have Athlons, so I haven't tested the SSE2 builds at all. If you use these and they work, I'd appreciate if you let me know. I have found about a 15%25 improvement in encode speed using the SSE builds on my machine. If you do some testing on your machine let me know. Uninstall the normal/previous version before installing these.%0a%3c %0a%3c
  %0a%3c %0a---%0a> These builds are specific to SSE and SSE2 compatible processors. If you run these on the wrong processor they will crash the program and maybe even your system. If in doubt don't use them !%0a> %0a> SSE2 instructions are for Pentium 4's. SSE instructions are for some Pentium 3's and Athlon XP's. None of the old athlons support them. Also note, I only have Athlons, so I haven't tested the SSE2 builds at all. If you use these and they work, I'd appreciate if you let me know. I have found about a 15%25 improvement in encode speed using the SSE builds on my machine. If you do some testing on your machine let me know. Uninstall the normal/previous version before installing these.%0a> %0a> %0a> %0a15,18c15,18%0a%3c !!![[(Attach:)oggcodecs_SSE_0.68.8333.zip | Download Now (992,504 bytes) - SSE enabled processors only]]%0a%3c %0a%3c %0a%3c !!![[(Attach:)oggcodecs_SSE2_0.68.8333.zip | Download Now (985,275 bytes) - SSE2 enabled processors only]]%0a---%0a> !!![[(Att
 ach:)/oggcodecs_SSE_0.68.8333.zip | Download Now (992,504 bytes) - SSE enabled processors only]]%0a> %0a> %0a> !!![[(Attach:)/oggcodecs_SSE2_0.68.8333.zip | Download Now (985,275 bytes) - SSE2 enabled processors only]]%0a
+host:1209340385=::1
+author:1209340206=silvia
+csum:1209340206=added Zen's original text
+diff:1209340206:1209340206:=1,25d0%0a%3c !! SSE/SSE2 Experimental Builds of Directshow Filters for Ogg Vorbis, Speex, Theora and FLAC%0a%3c %0a%3c These are experimental builds only... if you have any doubt about whether your processor supports these, download the official release from the [[Main/HomePage | main page]].%0a%3c %0a%3c These builds are specific to SSE and SSE2 compatible processors. If you run these on the wrong processor they will crash the program and maybe even your system. If in doubt don't use them !%0a%3c %0a%3c SSE2 instructions are for Pentium 4's. SSE instructions are for some Pentium 3's and Athlon XP's. None of the old athlons support them. Also note, I only have Athlons, so I haven't tested the SSE2 builds at all. If you use these and they work, I'd appreciate if you let me know. I have found about a 15%25 improvement in encode speed using the SSE builds on my machine. If you do some testing on your machine let me know. Uninstall the normal/previous
  version before installing these.%0a%3c %0a%3c %0a%3c %0a%3c !! Current Version  0.68.8333 - 06/12/2004%0a%3c %0a%3c Mainly bugfixes.%0a%3c %0a%3c !!![[(Attach:)/oggcodecs_SSE_0.68.8333.zip | Download Now (992,504 bytes) - SSE enabled processors only]]%0a%3c %0a%3c %0a%3c !!![[(Attach:)/oggcodecs_SSE2_0.68.8333.zip | Download Now (985,275 bytes) - SSE2 enabled processors only]]%0a%3c %0a%3c %0a%3c !!! Changes this version%0a%3c %0a%3c * Fixed playback from windows network drives.%0a%3c * Fixed bug where audio would stop if you seek really close to the end.%0a%3c * Seeking performance back to almost instant%0a
+host:1209340206=::1

Added: trunk/oggdsf/website/wiki.d/Site.AllRecentChanges
===================================================================
--- trunk/oggdsf/website/wiki.d/Site.AllRecentChanges	                        (rev 0)
+++ trunk/oggdsf/website/wiki.d/Site.AllRecentChanges	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,8 @@
+version=pmwiki-2.2.0-beta65 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-GB; rv:1.9b5) Gecko/2008032619 Firefox/3.0b5
+ctime=1209305000
+host=::1
+name=Site.AllRecentChanges
+rev=36
+text=* [[Main.History]]  . . . April 28, 2008, at 10:00 AM by [[~silvia]]: [==]%0a* [[Main.HomePage]]  . . . April 28, 2008, at 09:56 AM by [[~silvia]]: [=added API documentation link=]%0a* [[Main.SseBuilds]]  . . . April 28, 2008, at 09:53 AM by [[~silvia]]: [==]%0a* [[Main.EncTheoraGraphedit]]  . . . April 28, 2008, at 09:40 AM by [[~silvia]]: [==]%0a* [[Main.Graphedit]]  . . . April 28, 2008, at 02:24 AM by [[~silvia]]: [=added Zen's original text=]%0a* [[Main.About]]  . . . April 28, 2008, at 01:53 AM by [[~silvia]]: [==]%0a* [[Main.DeveloperInfo]]  . . . April 28, 2008, at 01:27 AM by [[~silvia]]: [=original Zen's page=]%0a* [[Main.Downloads]]  . . . April 28, 2008, at 01:19 AM by [[~silvia]]: [==]%0a* [[Site.SideBar]]  . . . April 28, 2008, at 12:13 AM by [[~silvia]]: [==]%0a
+time=1209340846

Added: trunk/oggdsf/website/wiki.d/Site.RecentChanges
===================================================================
--- trunk/oggdsf/website/wiki.d/Site.RecentChanges	                        (rev 0)
+++ trunk/oggdsf/website/wiki.d/Site.RecentChanges	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,8 @@
+version=pmwiki-2.2.0-beta65 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-GB; rv:1.9b5) Gecko/2008032619 Firefox/3.0b5
+ctime=1209305000
+host=::1
+name=Site.RecentChanges
+rev=5
+text=* [[Site/SideBar]]  . . . April 28, 2008, at 12:13 AM by [[~silvia]]: [==]%0a
+time=1209305607

Added: trunk/oggdsf/website/wiki.d/Site.SideBar
===================================================================
--- trunk/oggdsf/website/wiki.d/Site.SideBar	                        (rev 0)
+++ trunk/oggdsf/website/wiki.d/Site.SideBar	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,29 @@
+version=pmwiki-2.2.0-beta65 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-GB; rv:1.9b5) Gecko/2008032619 Firefox/3.0b5
+author=silvia
+charset=ISO-8859-1
+csum=
+host=::1
+name=Site.SideBar
+passwdedit=@_site_edit
+rev=5
+targets=Main.HomePage,Main.Downloads,Main.DeveloperInfo,Main.History,Main.About,Site.SideBar
+text=* [[Main/HomePage | Home]]%0a* [[Main/Downloads]]%0a* [[Main/DeveloperInfo | Developer Info]]%0a* [[Main/History]]%0a* [[/docs | Documentation]]%0a* [[Main/About]]%0a%0a%25sidehead%25 [[http://www.xiph.org/ | Xiph.org ]]%0a* [[http://www.vorbis.com/ | Vorbis ]]%0a* [[http://www.speex.org/ | Speex ]]%0a* [[http://www.theora.org/ | Theora ]]%0a* [[http://flac.sourceforge.net/ | FLAC]]%0a* [[http://www.annodex.net/ | Annodex ]]%0a%0a%25right%25 [-[[Site.SideBar?action=edit | edit SideBar]]-]%0a
+time=1209305607
+author:1209305607=silvia
+diff:1209305607:1209305510:minor=1c1%0a%3c * [[Main/HomePage | Home]]%0a---%0a> * [[Main/HomePage]]%0a
+host:1209305607=::1
+author:1209305510=silvia
+diff:1209305510:1209305491:minor=8c8%0a%3c %25sidehead%25 [[http://www.xiph.org/ | Xiph.org ]]%0a---%0a> %25sidehead%25 [[http://www.xiph.org | Xiph.org ]]%0a
+host:1209305510=::1
+author:1209305491=silvia
+csum:1209305491=added xiph section
+diff:1209305491:1209305086:=8,13c8,12%0a%3c %25sidehead%25 [[http://www.xiph.org | Xiph.org ]]%0a%3c * [[http://www.vorbis.com/ | Vorbis ]]%0a%3c * [[http://www.speex.org/ | Speex ]]%0a%3c * [[http://www.theora.org/ | Theora ]]%0a%3c * [[http://flac.sourceforge.net/ | FLAC]]%0a%3c * [[http://www.annodex.net/ | Annodex ]]%0a---%0a> %25sidehead%25 [[http://www.pmwiki.org | pmwiki.org ]]%0a> * [[Cookbook:CookbookBasics | Cookbook (addons) ]]%0a> * [[Cookbook:Skins | Skins (themes) ]]%0a> * [[PITS:PITS | PITS (issue tracking) ]]%0a> * [[PmWiki/Mailing Lists]]%0a
+host:1209305491=::1
+author:1209305086=silvia
+diff:1209305086:1209305000:minor=5c5%0a%3c * [[/docs | Documentation]]%0a---%0a> * [[/docs | Documentation]%0a14a15,16%0a> %0a> * [[PmWiki/Basic Editing]]%0a
+host:1209305086=::1
+author:1209305000=silvia
+csum:1209305000=editing sidebar and fixing stylesheet
+diff:1209305000:1125550800:=2,7c2,12%0a%3c * [[Main/Downloads]]%0a%3c * [[Main/DeveloperInfo | Developer Info]]%0a%3c * [[Main/History]]%0a%3c * [[/docs | Documentation]%0a%3c * [[Main/About]]%0a%3c %0a---%0a> * [[Main/WikiSandbox]]%0a> %0a> %25sidehead%25 [[PmWiki/PmWiki]]%0a> * [[PmWiki/Initial Setup Tasks]]  %0a> * [[PmWiki/Basic Editing]]%0a> * [[PmWiki/Documentation Index]]%0a> * [[PmWiki/FAQ | PmWiki FAQ ]]%0a> * [[PmWiki/PmWikiPhilosophy]]%0a> * [[PmWiki/Release Notes]]%0a> * [[PmWiki/ChangeLog]]%0a> %0a14,16c19%0a%3c %25right%25 [-[[Site.SideBar?action=edit | edit SideBar]]-]%0a%3c %0a%3c * [[PmWiki/Basic Editing]]%0a---%0a> %25right%25 [-[[Site.SideBar?action=edit | edit SideBar]]-]%0a\ No newline at end of file%0a
+host:1209305000=::1

Added: trunk/oggdsf/website/wiki.d/SiteAdmin.Status
===================================================================
--- trunk/oggdsf/website/wiki.d/SiteAdmin.Status	                        (rev 0)
+++ trunk/oggdsf/website/wiki.d/SiteAdmin.Status	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,8 @@
+version=pmwiki-2.2.0-beta65 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-GB; rv:1.9b5) Gecko/2008032619 Firefox/3.0b5
+host=::1
+name=SiteAdmin.Status
+rev=1
+text=(:comment Any local edits to this page may be lost!:)%0a%0aThis site is running {$Version} (VersionNum={$VersionNum}).%0a
+time=1209302024
+updatedto=2001965

Added: trunk/oggdsf/website/wikilib.d/Main.HomePage
===================================================================
--- trunk/oggdsf/website/wikilib.d/Main.HomePage	                        (rev 0)
+++ trunk/oggdsf/website/wikilib.d/Main.HomePage	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,10 @@
+version=pmwiki-2.1.0 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.7.12) Gecko/20050915
+author=HaganFox
+csum=Bold "first time installers:" wasn't necessary.
+host=216.161.175.221
+name=Main.HomePage
+rev=200
+targets=PmWiki.DocumentationIndex,PmWiki.InitialSetupTasks,PmWiki.BasicEditing,Main.WikiSandbox
+text=Welcome to PmWiki!%0a%0aA local copy of PmWiki's%0adocumentation has been installed along with the software,%0aand is available via the [[PmWiki/documentation index]].  %0a%0aTo continue setting up PmWiki, see [[PmWiki/initial setup tasks]].%0a%0aThe [[PmWiki/basic editing]] page describes how to create pages%0ain PmWiki.  You can practice editing in the [[wiki sandbox]].%0a%0aMore information about PmWiki is available from http://www.pmwiki.org .%0a
+time=1142203034

Added: trunk/oggdsf/website/wikilib.d/Main.WikiSandbox
===================================================================
--- trunk/oggdsf/website/wikilib.d/Main.WikiSandbox	                        (rev 0)
+++ trunk/oggdsf/website/wikilib.d/Main.WikiSandbox	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,9 @@
+version=pmwiki-2.0.devel1
+newline=²
+version=pmwiki-2.0.devel1
+text=Feel free to use this page to experiment with the [[PmWiki/Text Formatting Rules]].  Just click the "Edit Page" link at the bottom of the page.²----²
+time=1093548433
+name=Main.WikiSandbox
+host=24.1.26.221
+agent=Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7) Gecko/20040707 Firefox/0.8
+rev=3

Added: trunk/oggdsf/website/wikilib.d/PmWiki.AccessKeys
===================================================================
--- trunk/oggdsf/website/wikilib.d/PmWiki.AccessKeys	                        (rev 0)
+++ trunk/oggdsf/website/wikilib.d/PmWiki.AccessKeys	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,12 @@
+version=pmwiki-2.2.0-beta51 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20061023 SUSE/2.0.0.2-1.1 Firefox/2.0.0.2
+author=Pm
+charset=ISO-8859-1
+csum=doc cleanup
+ctime=1137027716
+host=76.183.97.54
+name=PmWiki.AccessKeys
+rev=79
+targets=PmWiki.Internationalizations,Site.Preferences,Site.PageActions,PmWiki.DocumentationIndex,PmWiki.AccessKeys
+text=(:Summary:Access keys are keyboard shortcuts for tasks that would otherwise require a mouse:)%0a%25audience%25 visitors (intermediate)%0aAccess keys are keyboard shortcuts for tasks that would otherwise require a mouse.   They are part of markup that may exist on any webpage, but on PmWiki steps have been taken to make it easier to use access keys throughout a site, and to make it possible to adjust key assignments to accommodate different languages and preferences.%0a%0a!!Using access keys in different operating systems and browsers%0aIn most cases, access keys require users to hold down one key -- Alt, on Windows, and Ctrl, on Macintosh -- and then press a second key (the "access key").  Exceptions exist for specific browsers, and specific versions.  For example, Internet Explorer requires that the Enter key be pressed at the end of the sequence for versions 5 and up under Windows, but not under Macintosh (where access keys were not supported until after version 4.5).
   Firefox versions 1.5 and earlier simply use Alt, while Firefox version 2.0 uses Shift+Alt.  For Opera, which makes extensive use of keyboard shortcuts for its own operation, access keys are invoked by pressing Shift and Escape before the selected access key character (without the Alt key).  Note, in cases of conflicts between the keyboard shortcuts assigned by browsers and access keys assigned by links and other markup on webpages, many browsers, including Mozilla, Netscape and Internet Explorer, allow access keys to override the browser defaults and require a different sequence to continue using overridden browser assignments (typically, by pressing and releasing the Alt key, instead of holding it down).   %0a%0aTo simplify the description below, these basic keyboard combinations, and exceptions, are referred to generally as "Akey+" on this page.  If you are using a Mac, just think Ctrl+, and if you are using a PC, think Alt+ or Alt+Shift+, unless you are using a browser 
 that requires something else.%0a%0a!!List of access key assignments in default PmWiki installation%0aThe following is a list of the access keys that are used by PmWiki in default English language installations.  Each of the letters identified below must be used together with the AKey+ combination for your operating system and browser.%0a||width=%0a||! Key ||!Function ||%0a||  e   ||edit||%0a||  h   ||history||%0a||  c   ||recent changes||%0a||  s   ||save page||%0a||  u   ||save and keep editing||%0a||  p   ||preview page||%0a||  i   ||emphasized text (''italic'')||%0a||  b   ||strong text ('''bold''')||%0a||  ,   ||jump to edit textarea (when in edit modes)||  %0a%0a!!Customizing access keys%0a%0aThe default access key values can be changed by site administrators using the string mapping methods to customize a site for other languages by modifying the config.php file.  See [[Internationalizations]].  Individuals who want to customize the keys used by their browser can use a
  similar string mapping approach by posting a special query parameter that sets a cookie on their browser.  See [[Site.Preferences]].%0a%0aNote that at least some skins (e.g., Lean) also specify access keys within their own template files (*.tmpl), using the accesskey attribute with the Edit, History, etc. links on the page.  In order to change the access keys when using these skins, it seems one must edit the template file itself.%0a%0a%25audience%25 admins (intermediate)%0a!!Access key string mapping variables%0aPmWiki uses the same "phrase translation" tables for access key mappings as it does for [[internationalization(s)]].  This makes it possible for administrators, skins, language translators, and visitors to all influence the way that specific keys are mapped to actions.  By convention, the translation phrases for all of the access key actions start with the characters "ak_", so that the page variable "[@$[ak_edit]@]" is replaced by the access key for editing as defi
 ned by the current preferences, language, skin default, or site default.  %0a%0aHere is a listing of the access key translation phrases defined by PmWiki 2.1 (and their current translation values).  Note that some actions do not have a corresponding access key by default.%0a%0a||width=%0a||!Phrase     ||!Key ||%0a||ak_view     ||$[ak_view]||%0a||ak_edit     ||$[ak_edit]||%0a||ak_history  ||$[ak_history]||%0a||ak_print    ||$[ak_print]||%0a||ak_recentchanges||$[ak_recentchanges]||%0a||ak_save     ||$[ak_save]||%0a||ak_saveedit ||$[ak_saveedit]||%0a||ak_preview  ||$[ak_preview]||%0a||ak_savedraft||$[ak_savedraft]||%0a||ak_em       ||$[ak_em]||%0a||ak_strong   ||$[ak_strong]||%0a%0a!!Implementation of access keys%0aAccess keys are implemented in html as optional parameters that can be added to links and many other types of markup.%0a%0a'''Example:'''  [@%3ca href="http://example.com" accesskey="x">Example%3c/a>@] would create a link to example.com that could be triggered by cli
 cking on the linked word "example" or using the access key Akey+x.  That same action key link could be created in PmWiki markup by typing [@%25item accesskey="x"%25[[http://example.com|Example]]@], like this: %25item accesskey="x"%25[[http://example.com|Example]].  Try it and see if it works.   Note that this AKey+x access key only works this way on this page, because it is simply a shortcut for accessing the link that exists only on this page.%0a%0aThe list of access key assignments in default PmWiki installations generally work throughout a site because links have been created in PmWiki skins and editing screens that incorporate access key parameters using the access key translation phrases.  One location where those links can be viewed is [[Site.PageActions]].  That page contains the links that the default PmWiki skin, and many other skins, use to generate links such as "View" "Edit" and "History" that appear on most pages (other than editing screens).  Each of the links 
 in that page also has an [@%25accesskey=$[ak_xxx]%25@] declaration in front of it, which enables a specific access key for that link.%0a%0a%25trail%25 %3c%3c|[[Documentation index]]|>>%0a%0a>>faq%3c%3c [[#faq]]%0a%0aQ: How can I change the keyboard shortcuts for editing and saving a page?%0a%0aA: See [[PmWiki.AccessKeys]].%0a
+time=1180139650

Added: trunk/oggdsf/website/wikilib.d/PmWiki.Audiences
===================================================================
--- trunk/oggdsf/website/wikilib.d/PmWiki.Audiences	                        (rev 0)
+++ trunk/oggdsf/website/wikilib.d/PmWiki.Audiences	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,11 @@
+version=pmwiki-2.2.0-beta51 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20061023 SUSE/2.0.0.2-1.1 Firefox/2.0.0.2
+author=Pm
+charset=ISO-8859-1
+csum=
+host=76.183.97.54
+name=PmWiki.Audiences
+rev=23
+targets=PmWiki.WikiAdministrator,PmWiki.PmWikiPhilosophy,PmWiki.LocalCustomizations,PmWiki.DocumentationIndex
+text=(:Summary:Patrick Michaud's comments regarding the "audiences" for which PmWiki was designed:)%0aThis page contains Patrick Michaud's comments regarding the "audiences" for which PmWiki was designed. As such, many people are reluctant to modify the page, because it is a statement of his opinions and describes some of the thought that went into creating PmWiki. (And we all thank him for that!) %0a%0a%0a!!Patrick's comments%0aI think of PmWiki in terms of two audiences: ''Authors'' are the people who generate web content using PmWiki, and [[wiki administrator]]s are the folks who install, configure, and maintain a PmWiki installation on a web server. In some senses it could be claimed that as the primary developer of PmWiki I should only have wiki administrators as my target audience, and that authors are the target audience for the administrators.  But what really makes PmWiki useful to wiki administrators is that I've put a lot of consideration into creating a tool that
  is usable by authors, so I have to keep the needs of both audiences in mind as I'm designing and adding new features to PmWiki. %0a%0aWithin the authoring audience I see that there are "naive authors" and "experienced authors". "Naive authors" are the folks who use wiki to generate content but may know next-to-nothing about HTML, much less style sheets or PHP or the like. Naive authors are easily discouraged from generating web content if they have to wade through markup text that has lots of funny and cryptic symbols in them. So, if we want a site with lots of contributors, we have to be very careful not to do things that will cause this group to exclude themselves from participating.%0a%0a"Experienced authors" are the folks who know a lot about HTML and could write their content as HTML, but have chosen to use wiki because of its other useful features (ease of linking, collaboration, ease of updates, revision histories, etc.) or because they want to collaborate with naive
  authors. Experienced authors usually don't have any problem with documents with lots of ugly markup in them; after all, they already know HTML.  Experienced authors are sometimes frustrated with wiki because it doesn't have markup that would let them do something they know they can do in HTML (e.g., tables, stylesheets, colored text, etc.). And, they sometimes have difficulty understanding why naive authors would turn away from documents that have lots of markup sequences in them.  %0a%0aFor the wiki administrator audience--the folks who install and may want to customize PmWiki--their backgrounds and goals are often quite diverse. PmWiki is designed so that it can be installed and be useful with minimal HTML/PHP knowledge, but it doesn't restrict people who know HTML/PHP from doing some fairly complex things. For one, PmWiki allows a site administrator to build-in markup sequences and features customized to his/her needs (and the needs of his/her audiences). %0a%0aThe separ
 ate needs of these audiences are behind most of the [[PmWikiPhilosoph(y)]]ies.  The people who develop PmWiki software must continually keep naive authors in mind as new features are requested and proposed by expert authors and Wiki Administrators.  Sometimes it may seem to these latter groups that it's okay to implement the complex features because "naive authors don't have to use them", but the truth is that if complex/ugly markup sequences are available then they will eventually be used by someone, and once used they become a barrier to the naive authors. So, if I see that a feature could become a barrier to a naive author I don't include it in the base implementation of PmWiki, but instead find ways to let Wiki Administrators include it as a [[local customization(s)]]. %0a%0a%25trail%25%3c%3c|[[Documentation Index]]|>>
+time=1180139702

Added: trunk/oggdsf/website/wikilib.d/PmWiki.AuthUser
===================================================================
--- trunk/oggdsf/website/wikilib.d/PmWiki.AuthUser	                        (rev 0)
+++ trunk/oggdsf/website/wikilib.d/PmWiki.AuthUser	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,11 @@
+version=pmwiki-2.2.0-beta57 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.4) Gecko/20061023 SUSE/2.0.0.4-1.1 Firefox/2.0.0.4
+author=Pm
+charset=ISO-8859-1
+csum=update for 2.2.0b58
+host=76.183.97.54
+name=PmWiki.AuthUser
+rev=82
+targets=PmWiki.Passwords,PmWiki.AdminTask,SiteAdmin.AuthUser,PmWiki.PasswordsAdmin,PmWiki.DocumentationIndex,PmWiki.AuthUser,Profiles.Lordmundi
+text=(:Summary:Authorization system that uses usernames and passwords:)%0a%25audience%25 administrators (intermediate)%0a%0aAuthUser is PmWiki's identity-based authorization system that allows access to pages to be controlled through the use of usernames and passwords.  AuthUser can be used in addition to the [[Passwords | password-based]] scheme that is PmWiki's default configuration.%0a%0aAuthUser is a very flexible system for managing access control on pages, but flexibility can also bring complexity and increased maintenance overhead to the wiki administrator.  This is why PmWiki defaults to the simpler password-based system.  For some thoughts about the relative merits of the two approaches, see [[PmWiki:ThoughtsOnAccessControl]].%0a%0aSee also:  [[Cookbook:Quick Start for AuthUser]]%0a%0a!! Activating AuthUser%0a%0a%0aTo activate PmWiki's identity-based system, add the following line%0ato ''local/config.php'':%0a%0a    include_once("$FarmD/scripts/authuser.php");%0a%0a
 Ensure that you have [[PmWiki/AdminTask#setSWPWE | set a site wide admin password]], otherwise you will not be able to edit [[SiteAdmin.AuthUser]].%0a%0a->%25note%25 Note: Older versions of PmWiki (before 2.2.0-beta58) use ''Site.AuthUser''.%0a%0a!! Creating user accounts%0a%0aMost of AuthUser's configuration is performed via the [[SiteAdmin.AuthUser]] page.  To change the AuthUser configuration, simply edit this page like any other wiki page (you'll typically need to use the site's admin password for this).%0a%0aTo create a login account, simply add lines to SiteAdmin.AuthUser that look like:%0a%0a    username: [=(:=]encrypt ''password'':)%0a%0aFor example, to create a login account for "alice" with a password of "wonderland", enter:%0a%0a    alice: [=(:=]encrypt wonderland:)%0a%0aWhen the page is saved, the "@@[=(:=]encrypt wonderland:)@@" part of the text will be replaced by an encrypted form of the password "wonderland".  This encryption is done so that someone looking a
 t the SiteAdmin.AuthUser page cannot easily determine the passwords stored in the page.  %0a%0aTo change or reset an account's password, simply replace the encrypted string with another @@[=(:=]encrypt:)@@ directive.%0a%0a%0a!! Controlling access to pages by login%0a%0aPages and groups can be protected based on login account by using "passwords" of the form [@id:username@] in the password fields of [@?action=attr@] (see [[PmWiki.Passwords]]).  For example, to restrict a page to being edited by Alice, one would set the password to "[@id:alice@]".%0a%0aIt's possible to use multiple "id:" declarations and passwords in the [@?action=attr@] form, thus the following setting would allow access to Alice, Carol, and anyone who knows the password "quick":%0a%0a    quick id:alice,carol%0a%0aTo allow access to anyone who has successfully logged in, use "[@id:*@]".%0a%0aOne can also perform site-wide restrictions based on identity in the $DefaultPasswords array: e.g.%0a%0a    # require v
 alid login before viewing pages%0a    $DefaultPasswords['read'] = 'id:*';%0a    # Alice and carol may edit%0a    $DefaultPasswords['edit'] = 'id:alice,carol';%0a    # All admins and Fred may edit%0a    $DefaultPasswords['edit'] = array('@admins', 'id:Fred');%0a%0aYou can change the $DefaultPasswords array in local customization files such as:%0a* local/config.php (for entire wiki)%0a* farmconfig.php (for entire wikifarm)%0a%0a%0a!! [[#auth_groups]] Organizing accounts into groups%0a%0aAuthUser also makes it possible to group login accounts together into authorization groups, indicated by a leading "@" sign.  As with login accounts, group memberships are maintained by editing the SiteAdmin.AuthUser page.  Group memberships can be specified by either listing the groups for a login account (person belongs to groups) or the login accounts for a group (group includes people).  You can repeat or mix-and-match the two kinds as desired:%0a%0a    @writers: alice, bob%0a    carol: @wr
 iters, @editors%0a    @admins: alice, dave%0a    %0aThen, to restrict page access to a particular group, simply use "[@@group@]" as the "password" in [@?action=attr@] or the $DefaultPasswords array, similar to the way that "[@id:username@]" is used to restrict access to specific login accounts.%0a%0a!!! Excluding individuals from password groups%0a%0aGroup password memberships are maintained by editing the SiteAdmin.AuthUser page. To specify a password group that allows access to anyone who is authenticated, you can specify:%0a%0a    @wholeoffice: *%0a%0aIf you need to keep "Fred" out of this password group, you might try:%0a%0a    @wholeoffice: *, -Fred%0a%0a... but this does %25red%25'''not'''%25%25 work. You can, however, get the desired result by using the first setting (@wholeoffice: *) on the SiteAdmin.AuthUser page and then setting the password for the page or group you wish to protect in [@?action=attr@] or the $DefaultPasswords array to "[@id:*, -Fred@]".%0a%0a%0a!!
  Getting account names and passwords from external sources%0a%0aThe AuthUser script has the capability of obtaining username/password pairs from places other than the SiteAdmin.AuthUser page, such as passwd-formatted files (usually called '.htpasswd' on Apache servers), [[#LDAP|LDAP]] servers, or even the ''local/config.php'' file.%0a%0a%0a!!! Passwd-formatted files (.htpasswd/.htgroup)%0a%0aPasswd-formatted files, commonly called ''.htpasswd'' files in Apache, are text files where each line contains a username and an encrypted password separated by a colon.  A typical ''.htpasswd'' file might look like:%0a%0a    alice:vK99sgDV1an6I%0a    carol:Q1kSeNcTfwqjs%0a%0aTo get AuthUser to obtain usernames and passwords from a ''.htaccess'' file, add the following line to SiteAdmin.AuthUser, replacing "/path/to/.htpasswd" with the filesystem path of the ''.htpasswd'' file:%0a%0a    htpasswd: /path/to/.htpasswd%0a%0aCreation and maintenance of the ''.htpasswd'' file can be performed 
 using a text editor, or any number of other third-party tools available for maintaining ''.htpasswd'' files.  The Apache web server typically includes an ''htpasswd'' command for creating accounts in .htpasswd:%0a%0a    $ htpasswd /path/to/.htpasswd alice%0a    New password:%0a    Re-type new password:%0a    Adding password for user alice%0a    $%0a%0aSimilarly, one can use ''.htgroup'' formatted files to specify group memberships.  Each line has the name of a group (without the "@"), followed by a colon, followed by a space separated list of usernames in the group.%0a%0a    writers: carol%0a    editors: alice carol bob%0a    admins: alice dave%0a%0aNote that the groups are still "@writers", "@editors", and "@admins" in PmWiki even though the file doesn't specify the @ signs.  To get AuthUser to load these groups, use a line in SiteAdmin.AuthUser like:%0a%0a    htgroup: /path/to/.htgroup%0a%0a    %0a!!! Configuration via ''local/config.php''%0a%0aAuthUser configuration setti
 ngs can also be made from the ''local/config.php'' file in addition to the SiteAdmin.AuthUser page.  Such settings are placed in the $AuthUser array, and ''must be set prior to including the ''authuser.php'' script''. Some examples:%0a%0a    # set a password for alice%0a    $AuthUser['alice'] = crypt('wonderland');%0a    # set a password for carol%0a    $AuthUser['carol'] = '$1$CknC8zAs$dC8z2vu3UvnIXMfOcGDON0';%0a    # define the @editors group%0a    $AuthUser['@editors'] = array('alice', 'carol', 'bob');%0a    # Use local/.htpasswd for usernames/passwords%0a    $AuthUser['htpasswd'] = 'local/.htpasswd';%0a    # Use local/.htgroup for group memberships%0a    $AuthUser['htgroup'] = 'local/.htgroup';%0a%0a[[#LDAP]]%0a!!! Configuration via LDAP%0a%0aAuthentication can be performed via an external LDAP server -- simply set an entry for "ldap" in either SiteAdmin.AuthUser or the ''local/config.php'' file.%0a%0a    # use ldap.airius.com for authentication%0a    $AuthUser['ldap'] =
  'ldap://ldap.airius.com/ou=People,o=Airius?cn?sub';%0a%0aLDAP authentication in AuthUser closely follows the model used by Apache 2.0's [[http://httpd.apache.org/docs/2.0/mod/mod_auth_ldap.html|mod_auth_ldap]] module; see especially the documentation for  [[http://httpd.apache.org/docs/2.0/mod/mod_auth_ldap.html#authldapurl|AuthLDAPUrl]] for a description of the url format.%0a%0aFor servers that don't allow anonymous binds, AuthUser provides $AuthLDAPBindDN and $AuthLDAPBindPassword variables to specify the binding to be used for searching.%0a%0a!! Setting the Author Name%0aBy default, PmWiki will use a login name in the Author field of the edit form, but allows the author to change this value prior to saving.  To force the login name to always be used as the author name, use the following sequence to activate AuthUser:%0a%0a    include_once("$FarmD/scripts/authuser.php");%0a    $Author = $AuthId;%0a%0aTo allow more flexibility, but still enable changes to be linked to the 
 authorized user, one can give the author name a prefix of the $AuthId instead:%0a[@%0a    include_once("$FarmD/scripts/author.php");%0a    include_once("$FarmD/scripts/authuser.php");%0a    if ($Author) {%0a	if (strstr($Author, '-') != false) {%0a	    $Author = "$AuthId-" . preg_replace('/^[^-]*-/', '', $Author);%0a	} else if ($Author != $AuthId) {%0a	    $Author = $AuthId . '-' . $Author;%0a	} else {%0a	    $Author = $AuthId;%0a	}%0a    } else {%0a	$Author = $AuthId;%0a    }%0a    $AuthorLink = "[[~$Author]]";%0a@]%0aThe above will allow the user to put in the author name of their choice, but that will always be replaced by that name prefixed with "$AuthId-".%0aThe reason why $AuthorLink needs to be set is that, if it isn't, the RecentChanges page will have the wrong link in it.%0a%0a!! Authorization, Sessions, and WikiFarms [[#sessions]]%0a%0aPmWiki uses PHP sessions to keep track of any user authorization information.  By default PHP is configured so that all interactions
  with the same server (as identified by the server's domain name) are treated as part of the same session.%0a%0aWhat this means for PmWiki is that if there are multiple wikis running within the same domain name, PHP will treat a login to one wiki as being valid for all wikis in the same domain.  The easiest fix is to tell each wiki to have use a different "session cookie".  Near the top of a wiki's ''local/config.php'' file, before calling authuser or other recipes, add a line like:%0a%0a-->[@session_name('XYZSESSID');@]%0a%0aThe XYZSESSID can be any unique name (letters only is safest).%0a%0a!! See Also%0a%0a* [[PmWiki.Passwords]]%0a* [[PmWiki.PasswordsAdmin]]%0a* [[Cookbook:AuthUser]] for tips and tricks%0a* [[SiteAdmin.AuthUser]]%0a%0a%25trail%25%3c%3c|[[Documentation Index]]|>>%0a%0a>>faq%3c%3c [[#faq]]%0a%0aQ:  I get http error 500 "Internal Server Error" when I try to log in. What's wrong?%0a%0aA:  This can happen if the encrypted passwords are not created on the web s
 erver that hosts the PmWiki.%0aThe crypt function changed during the PHP development, e.g. a password encrypted with PHP 5.2 can not be decrypted in PHP 5.1, but PHP 5.2 can decrypt passwords created by PHP 5.1.%0aThis situation normally happens if you prepare everything on your local machine with the latest PHP version and you upload the passwords to a webserver which is running an older version.%0aThe same error occurs when you add encrypted passwords to local/config.php.%0a%0aSolution: Create the passwords on the system with the oldest PHP version and use them on all other systems.%0a%0aQ:  Can I specify authorization group memberships from with ''local/config.php''?%0a%0aA:  Yes -- put the group definition into the $AuthUser array:%0a%0a        $AuthUser['@editors'] = array('alice', 'carol', 'bob');%0a%0aQ:  I'm running multiple wikis under the same domain name, and logins from one wiki are appearing on other wikis.  Shouldn't they be independent?%0a%0aA:  This is caused
  by the way that PHP treats sessions.  See [[PmWiki.AuthUser#sessions]] for more details.%0a%0aQ:  How can I access the authorization groups that the current user belongs to in order to test using that as a condition of an if statement?%0a%0aQ: Is there any way to have groups inherit other groups (e.g. @fruits: @apples, @oranges, jack)?%0a%0aQ: Is it possible to list more than one .htpasswd and .htgroup file to be used?  e.g. if I am running a wikifarm and some users are common across various fields, it would be nice if they only needed to update their password once.  Sure I could merge all the passwd & group files, but then I wouldn't be able to support identical user or group names on each independent wikifield..%0a%0aQ: Is there any way to record the time of the last login for each user when using AuthUser?  I need a way to look for stale accounts.%0a%0aA: I wrote a recipe to do something like this.  It records the last action for each user (not necessarily just login act
 ions).  See [[Cookbook:UserLastAction]] for more info. --[[~Lordmundi]] March 23, 2007%0a%0aQ:  I want to allow anyone to edit my wiki, but don't want anyone else to use my name as the author.  Is there a way to "reserve" and password protect certain usernames?  Or basically just require a password when attempting to edit a page with a registered user's name in the author field?
+time=1184707927

Added: trunk/oggdsf/website/wikilib.d/PmWiki.AvailableActions
===================================================================
--- trunk/oggdsf/website/wikilib.d/PmWiki.AvailableActions	                        (rev 0)
+++ trunk/oggdsf/website/wikilib.d/PmWiki.AvailableActions	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,10 @@
+version=pmwiki-2.2.0-beta17 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.8) Gecko/20060911 SUSE/1.5.0.8-0.2 Firefox/1.5.0.8
+author=Pm
+csum=
+host=76.183.97.54
+name=PmWiki.AvailableActions
+rev=43
+targets=PmWiki.DocumentationIndex,PmWiki.Passwords,PmWiki.WebFeeds,PmWiki.RefCount,PmWiki.SitePreferences,PmWiki.CustomMarkup,PmWiki.UrlApprovals,Cookbook.Cookbook,Cookbook.BackupPages,Cookbook.ROEPatterns,Cookbook.DeleteAction,Cookbook.GeneratePDF,Cookbook.PmWiki2PDF,Cookbook.ASCIIMath,Cookbook.RenamePage,Cookbook.SharedPages,Cookbook.WebAdmin
+text=%25trail%25 %3c%3c|[[DocumentationIndex]]|>>%0a%0a!! Default Actions%0a%0a:?action='''browse''': display the specified page (default action if no [@?action=@] is present)%0a%0a:?action='''edit''': edit the specified page%0a%0a:?action='''diff''': show a change history of the specified page%0a%0a:?action='''attr''': displays dialog for setting/changing password of the specified page, see [[PmWiki/Passwords]]%0a%0a:?action='''upload''': display a form to upload an attachment for the current group%0a%0a:?action='''download'''&upname=''file.ext'': retrieve the page's attachment named ''file.ext''%0a%0a:?action='''crypt''': displays a form for generating hashed passwords out of clear text for usage in your config.php%0a%0a:?action='''print''': display the specified page using the skin specified by $ActionSkin['print']%0a%0a:?action='''search''': displays searchbox on current page%0a%0a:?action='''search'''&q=''searchterm'': performs search with ''searchterm'' and displays re
 sults on current page%0a%0a:?action='''source''': show page source%0a%0a:?action='''login''': prompt visitor for username/password%0a%0a:?action='''logout''': remove author, password, and login information%0a%0a:?action='''rss''':%0a:?action='''atom''':%0a:?action='''rdf''':%0a:?action='''dc''': If [[web feeds]] are enabled, returns a syndication feed based on the contents of the page or other options provided by the url.%0a%0a:?action='''refcount''': bring up the reference count form, which allows the user to generate a list of links (all, missing, existing or orphaned) in or from specified groups.  See [[RefCount]].  Part of the core distribution but must be enabled by the administrator.%0a%0a:?'''setprefs'''=SomeGroup.CustomPreferences: sets cookie to custom preferences page. See [[SitePreferences]]%0a%0a!! Actions enabled by $EnableDiag:%0a[[#BEGENABLEDIAG]]the following actions are available only if you set [@$EnableDiag = 1@] in your configuration file. They can be use
 d for debugging and should not be set in a production environment.%0a%0a:?action='''ruleset''': displays a list of all markups in 3 columns:%0a** column 1 = markup-name (1. parameter of markup() )%0a** column 2 = when will rule apply (2. parameter of markup() )%0a** column 3 = PmWiki's internal sort key (derived from #2)%0a->(see [[Custom Markup]]).%0a->To see more than what [@?action=ruleset@] gives you, apply the [[Cookbook:MarkupRulesetDebugging]] recipe: it can also show the pattern and the replacement strings.%0a%0a:?action='''phpinfo''': displays the output of phpinfo() and exits. no page will be processed%0a%0a:?action='''diag''': displays a dump of all global vars and exits. no page will be processed%0a[[#ENDENABLEDIAG]]%0a%0a[[#Analyse]]%0a!! Actions enabled by PmWiki Scripts%0a:?action='''analyze''': see [[PmWiki:SiteAnalyzer]] and [[PmWiki:AnalyzeResults]]%0a%0a:?action='''approvesites''': see [[PmWiki/Url approvals]]%0a%0a[[#endanalyse]]%0a%0a[[#cookbook]]%0a!! A
 ctions enabled by [[Cookbook]] recipes%0a:?action='''backup''': see [[Cookbook.Backup pages]]%0a%0a:?action='''convert''': see [[Cookbook.ROE patterns]]%0a%0a:?action='''delete''': see [[Cookbook.Delete action]]%0a%0a:?action='''pdf''': see [[Cookbook.Generate PDF]] or [[Cookbook.PmWiki2PDF]]%0a%0a:?action='''purgeqns''': see [[Cookbook.ASCII math]]%0a%0a:?action='''rename''':%0a:?action='''links''': see [[Cookbook.Rename page]]%0a%0a:?action='''share''':%0a:?action=''unshare''': see [[Cookbook.Shared pages]]%0a%0a:?action='''webadmin''': see [[Cookbook.Web admin]]%0a%0a[[#endcookbook]]%0a%0a%25trail%25%3c%3c|[[PmWiki.Documentation Index]]|>>
+time=1166199272

Added: trunk/oggdsf/website/wikilib.d/PmWiki.BackupAndRestore
===================================================================
--- trunk/oggdsf/website/wikilib.d/PmWiki.BackupAndRestore	                        (rev 0)
+++ trunk/oggdsf/website/wikilib.d/PmWiki.BackupAndRestore	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,12 @@
+version=pmwiki-2.2.0-beta42 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3
+author=Anno
+charset=ISO-8859-1
+csum=summary
+ctime=1134693395
+host=85.125.178.31
+name=PmWiki.BackupAndRestore
+rev=8
+targets=PmWiki.DocumentationIndex
+text=(:Summary:background information and some basic backup and restore procedures:)%0a%0aThis page has some background information on making backups and explains some basic *nix backup and restore procedures.%0a%0a!! Introduction%0a%0aYour wiki installation contains some unique data in the following directories:%0a%0a    local/         Local configuration scripts%0a    cookbook/      Recipes obtained from the [[(Cookbook:)Cookbook]]%0a    pub/           Publicly accessible files%0a    wiki.d/        Wiki pages%0a    uploads/       Uploaded files (attachments)%0a%0aA good backup plan will include periodically archiving these directories &mdash; or at bare minimum [@local/@] and [@wiki.d/@].  Good practice dictates keeping your backup archives on a separate machine.%0a%0a!! Simple Backup and Restore (*nix)%0a%0aWhen it comes to backup, simpler is better.  Since the pmwiki distribution is very small (about 1/4 megabyte), it's simplest to just archive the distribution files alo
 ng with the data.%0a%0a!!! Making a Backup Archive%0a%0aThe following *nix command, executed from the parent directory of your wiki's directory, will put a complete backup archive of your site in your home directory.%0a%0a-> [@%0atar -zcvf  ~/wiki-backup-`date +%25Y%25m`.tar.gz  wiki/%0a@]%0a%0a!!! Restoring the Backup Archive%0a%0a!!!! Simple Method%0a%0aYour site can be restored and running in under 30 seconds with%0a%0a-> [@%0atar -zxvf ~/wiki-backup-200512.tar.gz%0afind wiki/uploads/ -type d |xargs chmod 777%0afind wiki/wiki.d/ -type d |xargs chmod 777%0a@]%0a%0a!!!! A Slightly-More-Secure Method%0a%0aThe simple restore commands above will give you world-writable files and directories.  You can avoid world-writable permissions by letting PmWiki create directories with the proper attributes (ownership and permissions) for you.%0a%0aStart with%0a%0a-> [@%0atar -zxvf ~/wiki-backup-200512.tar.gz%0arm -rf wiki/wiki.d%0arm -rf uploads%0achmod 2777 wiki/%0a@]%0a%0aNow upload a 
 file in each group that had uploads.  If your site doesn't have uploads, just visit your site once so the wiki.d/ directory will be created.%0a%0aFinish your installation with%0a%0a-> [@%0achmod 755 wiki/%0atar -zxvf ~/wiki-backup-200512.tar.gz%0a@]%0a%0a%0a!!! Details%0a%0aThe commands on this page assume your site is in a directory called "wiki/".  The test backup was made in December, 2005 so it's named accordingly.%0a%0aYour site will only have an uploads/ directory if uploads are enabled.%0a%0aThe backup command uses a date stamp (YYYYMM) in the filename.  If you automate the command via cron you'll wind up with monthly snapshots of your site.  You can get a daily snapshot by appending %25d to the date command ([@`date +%25Y%25m%25d`@] will get you YYYYMMDD).  Be wary of space limitations if you have a large uploads/ directory.%0a%0a%0a!! See Also%0a%0a* A [[http://thread.gmane.org/gmane.comp.web.wiki.pmwiki.user/20317| thread]] [gmane.org] on the pmwiki-users mailing l
 ist.%0a* A [[(Cookbook:)BackupPages]] recipe in the cookbook.%0a%0a%25trail%25%3c%3c|[[DocumentationIndex]]|>>
+time=1176388852

Added: trunk/oggdsf/website/wikilib.d/PmWiki.BasicEditing
===================================================================
--- trunk/oggdsf/website/wikilib.d/PmWiki.BasicEditing	                        (rev 0)
+++ trunk/oggdsf/website/wikilib.d/PmWiki.BasicEditing	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,12 @@
+version=pmwiki-2.2.0-beta52 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.2) Gecko/20061023 SUSE/2.0.0.2-1.1 Firefox/2.0.0.2
+author=Pm
+charset=ISO-8859-1
+csum=fix case
+host=76.183.97.54
+name=PmWiki.BasicEditing
+rev=269
+targets=PmWiki.ListStyles,PmWiki.WikiSandbox,Main.WikiSandbox,PmWiki.TableDirectives,PmWiki.Tables,PmWiki.BasicEditing,PmWiki.WikiStyles,PmWiki.WikiWikiWeb,PmWiki.Passwords,PmWiki.TextFormattingRules,PmWiki.MarkupMasterIndex,PmWiki.Links,PmWiki.InterMap,PmWiki.Images,PmWiki.DocumentationIndex,PmWiki.WikiTrails,PmWiki.SpecialCharacters,PmWiki.PmWikiPhilosophy
+text=(:Summary: PmWiki's basic edit syntax:)%0a(:Title Basic PmWiki editing rules:)%0a%0a%25audience%25 authors (basic)%0a%0aThe pages on this site are [[WikiWikiWeb]] pages, which means that pages can be created and edited by multiple authors. To edit a page, click the '''Edit''' link that exists '''somewhere''' on the page, usually in the header or footer. Some pages may be [[password(s)]]-protected, depending on the system's security policies, but many systems allow open editing of pages.%0a%0aWhen editing a page, you see the ''markup text'' that describes the content of the page.  The basic rules for page markup are simple:%0a# Put a blank line between paragraphs.%0a# To make a list, start each line with # for numbered (ordered) lists or * for bulleted (unordered) lists.%0a# To make a heading, start a line with two or more ! marks; !! is a subheading, and !!! is a sub-subheading.%0a# To emphasize text, enclose it in 2 or 3 ''single quotes''; [@''text''@] for italics or [
 @'''text'''@] for bold.%0a# To make a link to another page, enclose the page's name in double brackets; for example [@[[basic editing]]@] links to this page. Links to nonexistent pages are displayed specially, to invite others to create the page.%0a# To make a link to another site, type its address, such as http://www.example.com/ .%0a%0a'''If you want to experiment with editing a page, try it on the [[Main/WikiSandbox]].''' You can [[Main/WikiSandbox?action=edit | edit the WikiSandbox]] without affecting anything important on this site. If you do edit other pages, it's courteous to '''sign''' your contribution; using [=~~=]~ effectively 'signs' the name that you provide in the Author field on the Page Edit form.%0a%0a!! Example%0a%0aThe table below demonstrates many of the common markups used to format pages.  The right column shows the effect of the markup, the left column shows what to write to achieve the effect.  More details are available from the [[text formatting rul
 es]] and other documentation pages. An '''exhaustive list''' of default markup is available as the [[markup master index]]%0a%0a!!! General Usage%0a%0a(:table class='markup horiz' align='center':)%0a(:cellnr  class='markup1':)%0a[-'''What to type'''-]%0a(:cell  class='markup2':)%0a[-'''What it looks like'''-]%0a(:tableend:)%0a%0a(:markup class=horiz:)%0aAn empty line%0a%0astarts a new paragraph.%0a(:markupend:)%0a%0a(:markup class=horiz:)%0aA single newline%0ausually doesn't affect the layout.  %0aUse two backslashes\\%0ato break a line.%0a[[%3c%3c]]%0aUse three backslashes\\\%0afor two line breaks.%0a(:markupend:)%0a%0a(:markup class=horiz:)%0aA single backslash \%0ajoins the next line \%0ato the previous one.%0a(:markupend:)%0a%0a!!![[#lists]] Lists %0a(:markup class=horiz:)%0a* lists are created by using asterisks%0a** more asterisks produce deeper lists%0a*** the list is terminated%0aby the first line that is not a list%0a(:markupend:)%0a%0a(:markup class=horiz:)%0a# Num
 bered lists%0a# are also possible%0a## more hashes produced deeper lists%0a*** and lists can nest%0a-> use [[list styles]] to maintain numbering%0a## Text between list items can cause numbering to restart%0a## %25item value=3%25 this can be dealt with%0a(:markupend:)%0a%0a(:markup class=horiz:)%0a-> An arrow (->) indents content.%0a%0a   Line up text to continue the indent.%0a%0a-->Longer arrows (-->) indent further.%0a%0a-%3cA reverse arrow (-%3c) creates a hanging indent, the first line is outdented and remaining lines are indented.%0a--%3cLonger reverse arrows (--%3c) indent further.%0a(:markupend:)%0a%0a(:markup class=horiz:)%0a: Definition list : list of definitions%0a: item : the item's definition%0a: another item : that item's definition%0a:: indentation : more leading colons produce deeper lists%0a(:markupend:)%0a%0a(:markup class=horiz:)%0a Lines that begin with%0a a space are formatted exactly%0a as typed, in a fixed-width font.%0a%0aNote that very long lines of pr
 eformatted text%0acan cause the whole page to be wide.%0a(:markupend:)%0a%0a(:markup class=horiz:)%0a%25rfloat%25 This text floats to the right%0a%0a%25rframe%25 This text floats to the right with a frame%0a%0a%25center%25 This text is centered.%0a%0a%25right%25 This text is right justified.%0a(:markupend:)%0a%0a(:markup class=horiz:)%0aFour or more dashes%0aat the beginning of a line%0a----%0aproduce a horizontal line.%0a(:markupend:)%0a%0a!!! [[#links]] [[Links]]%0a%0a(:table class='markup horiz'  align='center':)%0a(:cellnr  class='markup1':)%0a[-'''What to type'''-]%0a(:cell  class='markup2':)%0a[-'''What it looks like'''-]%0a(:tableend:)%0a%0a(:markup class=horiz:)%0a* Text in double brackets become links to other pages.%0a* Words are automatically capitalized in page titles.%0aPractice editing%0ain the [[wiki sandbox]].%0a(:markupend:)%0a%0a* When linking to a page in a different wikigroup, provide the group name, followed by a separator, and then the page name.%0a* If
  the separator you use is a slash, only the page name will appear.%0a* If the separator you use is a dot, the full string (group name and page name) will appear.%0a(:markup class=horiz:)%0aPractice editing%0ain the [[Main/WikiSandbox]].%0a%0aWhich one?%0aOh, in the [[Main.WikiSandbox]].%0a(:markupend:)%0a%0a* Text after a pipe (|) is used as the link text, or use the alternate (and perhaps more understandable) arrow (text -> link) notation.%0a* PmWiki adds capitalisation to links%0a(:markup class=horiz:)%0aPractice editing in the%0a[[WikiSandbox | practice area]].%0a%0aPractice editing in the%0a[[Main.WikiSandbox | practice area]].%0a%0aPractice editing in the%0a[[practice area -> Wiki sandbox]].%0a%0aAdvanced tables are described in [[table directives]].%0a(:markupend:)%0a%0a* Endings become part of the link text.%0a* Parentheses hide parts of the link name.%0a(:markup class=horiz:)%0aPractice editing in the%0a[[wiki sandbox]]es.%0a%0aPractice editing in the%0a[[(wiki) sand
 box]].%0a# as reference: [[Tables |#]]%0a# to a page title [[Basic editing|+]]%0a(:markupend:)%0a%0a* PmWiki can use [[InterMap| InterMap prefixes]] that have specific meanings.%0a* Parentheses can hide those too.%0a(:markup class=horiz:)%0aWhat's an [[(Wikipedia:)aardvark]], anyway?%0a(:markupend:)%0a%0a(:markup class=horiz:)%0aLinks to external sources can be entered%0a# bare url:  http://google.com%0a# link text: [[http://google.com | Google]]%0a# as reference: [[http://google.com |#]]%0a(:markupend:)%0a%0a(:markup class=horiz:)%0aLinks can open in another window,%0aas in %25newwin%25 http://www.pmwiki.org.%0a(:markupend:)%0a%0a!!! Character formatting%0a%0a(:table class='markup horiz'  align='center':)%0a(:cellnr  class='markup1':)%0a[-'''What to type'''-]%0a(:cell  class='markup2':)%0a[-'''What it looks like'''-]%0a(:tableend:)%0a%0a* These are all apostrophes (single-quote marks), not double-quotes.%0a(:markup class=horiz:)%0a''Emphasize'', '''strongly''', %0a'''''very
  strongly'''''.%0a(:markupend:)%0a%0a(:markup class=horiz:)%0a@@Monospaced text@@%0a%0a[@This is a%0a  preformatted%0a    text block@]%0a(:markupend:)%0a%0a(:markup class=horiz:)%0a* Text with '^superscripts^'%0a* Text with '_subscripts_'%0a* deleted {-strikethrough-} text%0a* inserted {+underline+} text%0a* [+big+], [++bigger++] text%0a* [-small-], [--smaller--] text%0a(:markupend:)%0a%0a!!! [[Wiki styles]]%0a%0a(:markup class=horiz:)%0a[[WikiStyles]] allow %25red%25 text%0a%25blue%25 to %25green%25 be in %0a%25color=#ff7f00%25 different %25%25colors.%0a(:markupend:)%0a%0a[[#headings]]%0a!!! Headings and blocks%0a%0a(:table class='markup horiz'  align='center':)%0a(:cellnr  class='markup1':)%0a[-'''What to type'''-]%0a(:cell  class='markup2':)%0a[-'''What it looks like'''-]%0a(:tableend:)%0a%0a* Headings are useful for creating a "well-structured" page.%0a  They're not just for making big text.%0a(:markup class=horiz:)%0a!! Major Subheading%0a!! [-Major Subheading With Smal
 ler Text-]%0a!!! Minor Subheading%0a!!!! And More%0a!!!!! Subheadings%0a(:markupend:)%0a%0a[[#pagetitles]]%0a!!! Page titles%0a%0a* The [@(:title:)@] directive sets the page's title to something other than its page name.%0a(:markup class=horiz:)%0a(:title Basic Editing:)%0aThe title of this page is {$Title}, spaced as {$Titlespaced}.%0a(:markupend:)%0a%0a[[#blockstyles]]%0a!!! Block styles%0a%0a* blocks allow styles to be applied across a number of lines and paragraphs of text and [[PmWiki/images]].%0a(:markup class=horiz:)%0a>>purple%3c%3c%0aAll of the text in this block%0ais purple.%0a* Purple cows and purple flowers%0a* Purple people eater%0a>>red%3c%3c%0a* Now this list is red%0a>>center%3c%3c%0a* and this text is centered%0a>>right green%3c%3c%0a* and this text is green and right justified%0a>>%3c%3c%0a* And this is normal%0a(:markupend:)%0a%0a%25trail%25 %3c%3c|[[Documentation Index]]|>>%0a%0a>>faq%3c%3c [[#faq]]%0a[[#beginning]]%0aQ: I'm new to PmWiki, where can I fin
 d some basic help for getting started?%0aA: The [[Basic Editing]] page is a good start.  From there, you can just follow the navigational links at the bottom of the page (they are called [[WikiTrails]]) to the next pages, or to the [[Documentation Index]] page, which provides an outline style index of essential documentation pages, organized from basic to advanced.%0a%0aQ: How do I include special characters on my wiki pages?%0aA: Use character codes to insert [[special characters]], such as Copyright (&#169;) and Trademark (&#174; or &#8482;) symbols, that don't appear on your keyboard.%0a%0aQ: Why are separate lines of text in the markup combined into a single line on output?%0aA: PmWiki normally treats consecutive lines of text as being a paragraph, and merges and wraps lines together on output.  This is consistent with most other wiki packages.  However, an author can use the [@(:linebreaks:)@] directive to cause separate lines of markup text to be kept as separate lines
  in the output.%0a%0aQ: Can I just enter HTML directly?%0aA: By default (and by design), PmWiki does not support the use of HTML elements in the editable markup for wiki pages. There are a number of reasons for this described in the [[PmWikiPhilosophy]] and [[PmWiki:Audiences]]. Basically, Pm feels that enabling HTML markup within wiki pages in a collaborative environment has the effect of excluding some potential authors from being able to edit pages, as well as posing a number of display and security issues.  However, a site administrator can use the [[Cookbook:EnableHTML]] recipe to enable the use of HTML markup directly in pages.%0a%0a
+time=1180212303
+title=Basic PmWiki editing rules

Added: trunk/oggdsf/website/wikilib.d/PmWiki.BasicVariables
===================================================================
--- trunk/oggdsf/website/wikilib.d/PmWiki.BasicVariables	                        (rev 0)
+++ trunk/oggdsf/website/wikilib.d/PmWiki.BasicVariables	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,11 @@
+version=pmwiki-2.2.0-beta45 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1
+author=Simon
+charset=ISO-8859-1
+csum=as in
+host=202.37.32.2
+name=PmWiki.BasicVariables
+rev=59
+targets=PmWiki.Variables,PmWiki.WikiGroup,Site.Search,Site.EditForm,Site.PageNotFound,PmWiki.WikiWord,PmWiki.PerGroupCustomizations,PmWiki.LocalCustomizations,PmWiki.AuthUser,PmWiki.MarkupExpressions,PmWiki.WikiFarms
+text=(:Summary: core variables:)%0a%3c%3c|[[PmWiki.Variables]]|>>%0a%0a:$DefaultGroup:[[WikiGroup]] used by default (on startup) when no group is specified in the URL, as in "{$DefaultGroup}".  %0a%0a:$DefaultName:Name of the default HomePage of each WikiGroup.  Used when the group doesn't have a page with the same name as the group, as in "{$DefaultName}".%0a%0a:$DefaultPage:Startup page when PmWiki is called without a specified page, normally ''$DefaultGroup.$DefaultName''.%0a%0a:$SiteGroup:Default group for storing configuration and utility pages such as [[Site.Search]], [[Site.EditForm]], [[Site.PageNotFound]], etc, as in "{$SiteGroup}".%0a%0a:$EnableWSPre:Enables a markup rule that causes lines with leading spaces to be treated as sections of preformatted text.  If set to a value greater than 1, indicates the minimum number of leading spaces required for this treatment.%0a:      :[@$EnableWSPre = 1;             # leading spaces are preformatted text@]%0a:      :[@$Enabl
 eWSPre = 0;             # leading spaces are normal lines of text@]%0a:      :[@$EnableWSPre = 4;             # 4+ spaces are preformatted text@]%0a%0a:$EnableWikiWords:Enable [[WikiWord]] processing.%0a%0a:$LinkWikiWords:If set, then bare WikiWords in a page are automatically linked to pages of the same name.  Note that this value can also be affected by the [@(:linkwikiwords:)@] and [@(:nolinkwikiwords:)@] directives.%0a:      :[@$LinkWikiWords = 1;           # turn on WikiWord links@]%0a:      :[@$LinkWikiWords = 0;           # disable WikiWord links@]%0a%0a:$SpaceWikiWords:If set, then WikiWords in pages are automatically spaced according to $AsSpacedFunction.  Note that this value can also be affected by the [@(:spacewikiwords:)@] and [@(:nospacewikiwords:)@] directives.%0a:      :[@$SpaceWikiWords = 1;          # turn on WikiWord spacing@]%0a:      :[@$SpaceWikiWords = 0;          # turn off WikiWord spacing@]%0a%0a:$AsSpacedFunction:The name of the function used to co
 nvert WikiWords into normal, spaced strings.  Defaults to '`AsSpaced'.%0a:      :[@$AsSpacedFunction = '`MyAsSpaced';@]%0a%0a:$EnablePGCust:Allows/disables per-page and [[PerGroupCustomizations | per-group customizations]].  Can be set to zero in any [[local customization(s)]] file to prevent remaining page/group customizations from being loaded.%0a:      :[@$EnablePGCust=0;              # turn off per-page/group configs@]%0a%0a:$EnableLocalConfig:Allows/disables local/config.php customizations (usually for a farm's wikis).  Can be set to zero in local/farmconfig.php to prevent the farm's wikis' local/config.php from being loaded.%0a:      :[@$EnableLocalConfig = 0;    # disable PmWiki's local/config@]%0a%0a:$GroupPattern: The regular expression pattern used for valid [[WikiGroup]] name specifications.  Defaults to allowing any group name beginning with an uppercase letter, but can be set to limit the valid group names (see Cookbook:LimitWikiGroups).%0a:      :[@# limit grou
 ps to Site, PmWiki, and `MyGroup@]%0a:      :[@$GroupPattern = '(?:Site|PmWiki|`MyGroup)';@]%0a%0a:$NamePattern: The regular expression pattern used for valid page names.  Defaults to allowing pages beginning with an uppercase letter or digit, followed by sequences of alphanumeric characters, hyphens, and underscores.  %0a%0a:$WikiWordPattern: The pattern that describes a WikiWord.%0a%0a:$Author: Set to the current reader, who is potentially an author ([[PmWiki:AuthoringPhilosophy|see discussion]]), as in "{$Author}".%0a%0a:$AuthorGroup: The WikiGroup for user profiles. Defaults to 'Profiles'.%0a:      :[@$AuthorGroup = 'Users';@]%0a%0a:$AuthId: For sites using [[AuthUser | user-based authorization]], tracks the "reader" or login name.%0a%0a:$TimeFmt: The format to use for dates and times, in [[http://php.net/strftime | strftime()]] format.  The default value is [@'%25B %25d, %25Y at %25I:%25M %25p'@], which gives dates of the form "September 8, 2005 at 10:57 PM".%0a:      :
 [@$TimeFmt = '%25B %25d, %25Y';        # dates as "September 8, 2005"@]%0a:      :[@$TimeFmt = '%25Y-%25m-%25d';         # dates as "2005-09-08"@]%0a%0a:$FTimeFmt:Can be used to override the default date format used by the "ftime" function.  The default $FTimeFmt is $TimeFmt.  (See [[Markup Expressions]])%0a%0a:$LogoutRedirectFmt: Identifies the page to which the visitor should be sent after an [@?action=logout@].  Defaults to the current page.%0a:      :[@$LogoutRedirectFmt = 'Site.Logout';    # ?action=logout target@]%0a%0a:$LogoutCookies: An array of cookie names to be removed when [@?action=logout@] is invoked.%0a%0a:$CookiePrefix: A string prefix to be prepended to cookies set from PmWiki scripts.  It defaults to '', but can be set to a different value to avoid conflicts with similar-named cookies from other applications, or to allow multiple wikis from the same domain to store separate cookies.%0a:      :[@$CookiePrefix = 'pmwiki_';@]     # set cookie prefix to 'pmwiki
 _'%0a::If you have a [[WikiFarm(s)]], use the following in each field's ''config.php'' to get a unique prefix for each field in the farm, thus isolating each field's cookies.:%0a:      :[@$CookiePrefix = substr($tmp = md5(__FILE__), 0, 5).'_';@]%0a%0a:$Version: A string representing the release version of PmWiki, as in "{$Version}".%0a%0a:$VersionNum: A number representing the release version of PmWiki,%0a with the major and minor release components padded with zeroes to%0a produce three digits.  Thus, release "pmwiki-2.1.40" will have%0a $VersionNum set to 2001040, as in "{$VersionNum}".%0a%0a The first digit is a 2, the next three digits are the major%0a release number, and the last three digits are the minor release%0a number. Beta releases use 900-999 for the minor release number.%0a Thus:%0a--> [@%0a2.1.0          2001000%0a2.1.1          2001001%0a...%0a2.1.27         2001027%0a2.2.0-beta1    2001901%0a2.2.0-beta2    2001902%0a...%0a2.2.0-beta18   2001918%0a...%0a2.2.0
           2002000%0a@]%0a%0a:$EnableRedirect:When enabled (default), causes page redirects to automatically be performed by the browser.  Setting $EnableRedirect to zero causes PmWiki to pause and issue a "Redirect to ''link''" message instead.  This is sometimes useful when debugging recipes to be able to see the results of actions before page redirections occur.%0a
+time=1178156055

Added: trunk/oggdsf/website/wikilib.d/PmWiki.Blocklist
===================================================================
--- trunk/oggdsf/website/wikilib.d/PmWiki.Blocklist	                        (rev 0)
+++ trunk/oggdsf/website/wikilib.d/PmWiki.Blocklist	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,12 @@
+version=pmwiki-2.2.0-beta57 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.4) Gecko/20061023 SUSE/2.0.0.4-1.1 Firefox/2.0.0.4
+author=Pm
+charset=ISO-8859-1
+csum=update Site -> SiteAdmin
+ctime=1159592216
+host=76.183.97.54
+name=PmWiki.Blocklist
+rev=36
+targets=PmWiki.Security,Archive.Blocklist,PmWiki.Passwords,PmWiki.PasswordsAdmin,SiteAdmin.Blocklist,PmWiki.PageHistory,PmWiki.WikiAdministrator,PmWiki.Variables,PmWiki.PageVariables,PmWiki.DocumentationIndex
+text=(:Summary:Blocking IP addresses, phrases, and expressions to counteract spam and vandalism.:)%0a%25audience%25 administrators (basic)%0aThe block list is one of a number of [[security]] measures that can be taken to protect your wiki from unwelcome postings.%0a%0a->%25font-size:small%25''the built-in blocklist is only enabled in the beta version; not in the stable release, see [[Archive.Blocklist]]''%0a%0aUnfortunately, the open-editability of many wiki systems often makes them attractive targets for "link spam" or "wikispam", in which links are added to pages in an effort to increase search engine rankings or drive traffic to other sites.  Also, many link spammers have developed automated systems to locate sites that accept visitor input and attempt to flood the site with unwanted links.%0aAlso, and harder to deal with, is just plain [[PmWiki/Security#wikivandalism|wiki vandalism]] where nonsense changes are made, often replacing entire pages.%0a%0aBy far the best coun
 termeasure against wikispam is to restrict editing through the use of passwords (see [[Passwords]] and [[Passwords Admin]]).  Experience has shown that passwords can be effective even if the password is widely known, and even if the password is publicly available on the site itself.  However, there are many cases where passwording may be an impediment, so these will generally want to use some form of blocklist.%0a%0a!! Blocklist basics%0a%0aA ''blocklist'' is a list of IP addresses, phrases, and expressions which are prevented from being added into pages on the website.  PmWiki is distributed with a built-in blocklisting capability; blocklists can be enabled by adding the following line to ''local/config.php'':%0a%0a    $EnableBlocklist = 1;%0a%0aThis tells PmWiki to scan the [[SiteAdmin.Blocklist]] page and the "SiteAdmin.Blocklist-Farm" page (and possibly other pages -- see below) looking for phrases and IP addresses to be excluded from posting to the site.%0a%0a!!! Blocki
 ng by word or phrase%0aThe simplest form of block is simply a line containing "[@block:@]" followed by a word or phrase to be excluded from postings.  For example, a line like %0a%0a-> [@block:spam.com @]%0a%0ain Site.Blocklist will block any posts containing the string "spam.com" (case-insensitive) anywhere in the post.%0a%0a[[#blockbyipaddress]]%0a!!! Blocking by IP address%0aSometimes we wish to restrict posts coming from particular addresses or address ranges that are known as sources of wikispam.  If a blocklist page contains IP addresses of the form "a.b.c.d" or "a.b.c.*", then any posts coming from that address or range will be blocked. %0a%0a-> %25note%25 To find an author's IP address, try hovering the mouse over the author name in the [[page history]] for a page.%0a%0a!!! Blocking by regular expression or pattern%0aBlocking on simple words can sometimes pose difficulties; for example, a simple "[@block:cial@]" entry will also block the word "specialist".  For these
  cases it's often helpful to use a regular expression, as in:%0a%0a->[@block:/\bcial\b/@]%0a%0aThis says to block "cial" only if it doesn't occur in the middle of a larger word.  The leading slash (/) after "block:" tells PmWiki to use a regular expression match instead of a simple string match.  (Blocklist uses PCRE or "Perl Compatible Regular Expressions"; see http://www.php.net/manual/en/ref.pcre.php for more information.)%0a%0a!! Letting authors know why they've been blocked%0a%0aBy default, blocklist only tells an author that a particular edit has been blocked, but doesn't give a specific reason for the blocking (e.g., the offending phrase).  Setting the following in a local customization file will also provide the reasons for the block:%0a%0a    $EnableWhyBlocked = 1;%0a%0a%0a!! Managing multiple blocklists%0a%0aPmWiki allows blocklist entries to come from multiple pages by setting the $BlocklistPages variable.  By default $BlocklistPages is set to "SiteAdmin.Blocklist
 ", as well as any automatically downloaded blocklists as described below.  PmWiki will use all entries in all the blocklists for filtering wikispam. Setting a value of $BlocklistPages changes the default:%0a%0a    $BlocklistPages = array('Main.Blocklist', '{$Group}.Blocklist');%0a%0aThe order of blocklists really doesn't matter -- all of the blocklist%0apages ultimately get used, and the [@unblock:@] entries are processed %0aafter all of the blocklist pages have been loaded.%0a%0a[[#automaticblocklists]]%0a!! Automatically downloaded blocklists%0a%0aMaintaining blocklists is relatively easy to do, but can become tedious over time.  Several groups have formed and maintain "shared blocklists", where a common blocklist is made available to all.  PmWiki's blocklist capability has built-in features for automatically downloading and updating such shared blocklists.%0a%0aIf you're just in a hurry to make use of some standard blocklists, make the following setting in ''local/config.
 php'':%0a%0a    $EnableBlocklist = 10;%0a%0aThis tells PmWiki to not only enable blocklists on the site, but to also configure itself to automatically retrieve and maintain local copies of well-known blocklists such as [[(http://)chongqed.org]] and [[http://moinmaster.wikiwikiweb.de/|MoinMaster]].  These local copies will be saved in SiteAdmin.Blocklist-Chonged and SiteAdmin.Blocklist-MoinMaster and refreshed once per day (as determined by the value of $BlocklistDownloadRefresh).%0a%0aTo automatically retrieve the [[SiteAdmin.Blocklist]] page used at pmwiki.org, add the following setting in ''local/config.php'':%0a%0a-> [@ $BlocklistDownload['SiteAdmin.Blocklist-PmWiki'] = array('format' => 'pmwiki'); @]%0a%0a!! Ignoring specific entries in a blocklist (unblock)%0a%0aWhen using a large master blocklist or blocklists automatically refreshed from external sites, it may be that some entries in the blocklists are inappropriate or overeager and block legitimate content.  In this 
 case a wikiadministrator can use "unblock" in a blocklist page to ignore an entry from the blocklist.  For example, to allow "spam.com" even if another blocklist has a block entry for it:%0a%0a    unblock:spam.com%0a%0aIn order for unblocking to work the phrase or pattern following "unblock:" must be ''exactly'' the same as the original.%0a%0a!! Permissions on blocklist pages%0a%0aIn general, an [[(wiki )administrator]] will want to edit-protect the SiteAdmin.Blocklist and any other blocklist pages to prevent arbitrary changes to the blocklist (see [[Passwords]]).  Since most pages in the SiteAdmin.* group are edit-protected by default anyway, this usually isn't a problem.%0a%0aAdministrators may also wish to read-protect the various blocklist pages so that others do not know the exact phrases and/or IP addresses that are being blocked.  (By their nature blocklists tend to contain phrases or terms that may be offensive or inappropriate to some.)%0a%0aAny pages created via au
 tomatic download (see above) are automatically locked against viewing except by administrators.  %0a%0a%25audience%25 administrators (intermediate)%0a!! Detailed configuration of automatically downloaded blocklists%0a%0aAutomatic downloading of blocklist information is controlled by the $BlocklistDownload array.  An entry for MoinMaster might look like:%0a%0a    $BlocklistDownload['SiteAdmin.Blocklist-MoinMaster'] = array(%0a      'url' => 'http://moinmaster.wikiwikiweb.de/BadContent?action=raw',%0a      'format' => 'regex',%0a      'refresh' => 86400);%0a%0aThis says to download the blocklist data from the given url into the SiteAdmin.Blocklist-MoinMaster page, that the entries in the blocklist are regular expressions, and to refresh the information every 86,400 seconds (one day).%0a%0aIf 'refresh' is omitted, then the page will be refreshed at the time interval given by $BlocklistDownloadRefresh (default one day).  If 'format' is omitted, the page is assumed to have PmWiki
 -formatted entries as described above.  If 'url' is omitted, then the blocklist information is downloaded from a standard location on the pmwiki.org site.%0a%0aTo force a refresh of an automatically downloaded blocklist, simply delete the existing page -- a new version will be installed upon the next blocklist scan.  Blocklist pages are checked for download in response to any ?action=edit request.%0a%0aIf you are specifying your Blocklist-Pages in the config.php you have to specify the automatically updated pages too, else they won't be updated or created even if you use $EnableBlocklist = 10; .%0a%0a!! Farm-wide blocklist%0a%0aA blocklist can be applied farm-wide  (see [[(Cookbook:)SharedPages]]).  %0aAfter these pages are created they can be moved into the farm ''shared.d/'' directory:%0a%0a!! [[#variables]] Blocklist Variables%0a%0a%3c%3c|[[Variables]]|>>%0a%0aThe following variables help control the configuration and operation of blocklists:%0a%0a:$EnableBlocklist:If set
  to a non-zero value, then blocklists are enabled on the site.  If set to a value of ten or higher, then add entries for automatic downloads of standard blocklists.%0a        $EnableBlocklist = 1;              # enable blocklists%0a        $EnableBlocklist = 10;             # auto-configure standard blocklists%0a%0a:$EnableWhyBlocked:By default, authors are not told which particular phrases or IP addresses are causing a particular post to be blocked; setting $EnableWhyBlocked to 1 provides this information.%0a        $EnableWhyBlocked = 1;             # give reasons for blocking%0a%0a:$BlocklistPages:An array of pages to be checked for blocklist entries.  The elements of the array may contain [[page variables]].  Defaults to "Site.Blocklist", plus any other automatically downloaded blocklist pages.%0a%0a:$BlocklistMessageFmt:The message to provide the author whenever a post has been blocked.%0a%0a:$BlockedMessagesFmt:If $EnableWhyBlocked is set, defines the text to use for e
 ach type of block being performed.  Currently only 'ip' and 'text' are recognized.%0a        $BlockedMessagesFmt['ip'] = "$[IP address blocked from posting]: ";%0a        $BlockedMessagesFmt['text'] = "$[Text blocked from posting]: ";%0a%0a:$BlocklistDownload:An array of automatically-downloaded blocklists.  The keys of the array are the pages in which the blocklists should be stored, the values contain the url, format, and refresh interval for the downloaded blocklist.%0a[@        # Download the MoinMaster blocklist every twelve hours%0a        $BlocklistDownload['SiteAdmin.Blocklist-MoinMaster'] = array(%0a          'url' => 'http://moinmaster.wikiwikiweb.de/BadContent?action=raw',%0a          'format' => 'regex',%0a          'refresh' => 43200);%0a        # Download a shared blocklist from pmwiki.org every day%0a        $BlocklistDownload['SiteAdmin.Blocklist-Shared'] = array(%0a          'format' => 'pmwiki');%0a@]%0a%0a:$BlocklistDownloadRefresh:The default refresh inte
 rval for any $BlocklistDownload entries that don't explicitly specify a 'refresh' value.%0a        # perform automatic downloads once per week by default%0a        $BlocklistDownloadRefresh = 86400 * 7;%0a%0a:$BlocklistDownloadFmt:The format to use when saving automatically downloaded blocklists.%0a%0a%0a:$EnableBlocklistImmediate:Some cookbook recipes update pages with author input but don't use the built-in data posting routines.  If $EnableBlocklistImmediate is set (default) and the current action is listed in $BlocklistActions (below), then an immediate blocklist scan is performed on the incoming text.%0a%0a:$BlocklistActions:A list of actions for which immediate blocklist checks should be performed (see $EnableBlocklistImmediate above).%0a        # perform immediate checks for ?action=comment%0a        $BlocklistActions['comment'] = 1;%0a        # perform immediate checks for ?action=postdata%0a        $BlocklistActions['postdata'] = 1;%0a%0a----%0a%0a%25trail%25 %3c%3c
 |[[Documentation Index]]|>>%0a
+time=1184708120

Added: trunk/oggdsf/website/wikilib.d/PmWiki.Categories
===================================================================
--- trunk/oggdsf/website/wikilib.d/PmWiki.Categories	                        (rev 0)
+++ trunk/oggdsf/website/wikilib.d/PmWiki.Categories	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,12 @@
+version=pmwiki-2.2.0-beta52 ordered=1 urlencoded=1
+agent=Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.2) Gecko/20061023 SUSE/2.0.0.2-1.1 Firefox/2.0.0.2
+author=Pm
+charset=ISO-8859-1
+csum=space alignment
+host=76.183.97.54
+keywords=categories, tags
+name=PmWiki.Categories
+rev=44
+targets=Category.GroupFooter,PmWiki.DocumentationIndex
+text=(:Summary:Categories are a way to organize and find related pages:)%0a(:keywords categories, tags:)%0a%25audience%25 authors (intermediate)%0a%0a!!Purpose of categories%0aCategories (also known as "tags") are a way to organize and find related pages.  Categories are implemented by default in PmWiki 2, and in most wikis they don't require any special code or markup, they're just a useful convention.  The idea is that every page that falls into a particular subject area should have a link to a shared page containing links to other pages on that subject.  These pages are created in the ''Category'' group, and thus these subject areas are called "categories".%0a%0a!!Using categories%0aGetting categories to work requires two steps, the first of which is adding links to each category.  A category named Subject is created by adding a link to [=Category.Subject=] on any page.  When you add the link to a page, the page can be described as being ''in'' the category "Subject".  %0
 a%0aThere is a special markup for creating these links which makes categories work more smoothly: [=[[!Subject]]=] will create a link to Category.Subject. So [=[[!Subject]]=] is a kind of shortcut to the page Subject in the category group.%0a%0aIf you click on the category links on a page, initially you'll just be taken to an empty page named ''Category.Subject''.  The second step in setting up categories is to modify the behavior of pages in the category group so that they will display a list of all pages containing links to ''Category.Subject''.  This is relatively simple to do:%0a%0a# Open the page [[Category.GroupFooter]] for editing%0a# Add the line [@(:pagelist link=Category.{*$Name} list=normal:)@]%0a# Save the edits%0a%0aThis will cause the footer on every page in the ''Category'' group to display a list of links to pages that reference that page in the category group.%0a%0aIt is worth noting that rather than adding this to Category.GroupFooter, the pagelist directiv
 e can be added to Category.GroupHeader to similar effect; it just depends on whether you'd prefer to have the list of pages appear before or after any text that you add to the individual category pages (which can be edited just like normal pages).%0a%0aBecause we use the normal [[Cookbook:PagelistExplained|PageList]] @@link=@@ markup, you can use it not only in the category group. If you want to show all pages belonging to the category Subject you can use on any wiki page [@(:pagelist link=Category.Subject list=normal:)@].%0a%0aSimilarly, there's no requirement that a "category page" has to be in the ''Category'' group -- any page can define a "category" of pages that link to it.%0a%0aAn administrator can override the default category group name of "Category" by setting the $CategoryGroup variable in ''config.php'' to another group name.%0a%0a!!!Recap%0aSo, by adding the link [=[[!Subject]]=] to a page, a link to that page will automatically appear on the page ''Category.Sub
 ject'', as long as  ''Category.GroupFooter'' has been tweaked appropriately.  Thus, you can create a page that automatically creates an alphabetized list of all movies discussed on your wiki by creating links to [=[[!Movies]]=] on each film's page; the resulting automatic list would be on the page ''Category.Movies'' .  %0a%0a%25audience%25 authors (advanced)%0a!!Category nesting%0aCategories have the potential for even greater usefulness because [@Category.*@] pages can themselves be placed into categories!  To follow an excellent example from John Rankin, let's suppose we have the following film pages in the categories listed to the right:%0a%0a-> [@%0aFilm.ShaunOfTheDead   [[!Horror]] [[!Comedy]] [[!2003]]%0aFilm.InMyFathersDen   [[!Drama]] [[!2004]]%0aFilm.TheCorporation   [[!Documentary]] [[!2003]]%0a@]%0a%0aNow then, we can create [@Category.Horror@], [@Category.Comedy@], [@Category.Drama@], and [@Category.Documentary@], and in each one of those pages we put [@[[!Genre
 ]]@].  In [@Category.2003@] and [@Category.2004@], we put [@[[!Year]]@].%0a%0aSo, what happens when we display [@Category.Genre@] ?  We see links to "Comedy", "Drama", "Documentary", and "Horror", because they're in the Genre category.  When we click on one of those links, we see all of the films listed in one of those categories.  Similarly, if we click on [@Category.Year@], we see links to "2003" and "2004", each of which in turn displays the list of films for that year.%0a%0aFinally, in [@Category.Genre@] and [@Category.Year@] we can put [@[[!Category]]@], which makes them "top-level" categories reachable from the [@Category.Category@] page.  Voila, we now have an instant "hierarchy":%0a%0a-> [@%0aCategory.Category%0a    Category.Genre%0a        Category.Comedy%0a            Film.ShaunOfTheDead%0a        Category.Drama%0a            Film.InMyFathersDen%0a        Category.Documentary%0a            Film.TheCorporation%0a        Category.Horror%0a            Film.ShaunOfTheD
 ead%0a    Category.Year%0a        Category.2003%0a            Film.ShaunOfTheDead%0a            Film.TheCorporation%0a        Category.2004%0a            Film.InMyFathersDen%0a@]%0a%0aNote however that this isn't a "strict" hierarchy--i.e., any page or category can appear simultaneously in multiple categories.  For example, [@Category.Documentary@] could be a member of both the Genre and top-level category listings.%0a%0aEach category page can have content text before the generated list, e.g., to give a generic description of things in the category. (Or it can be empty, which works fine.) It can also contain associations to related categories ("see also" references). For example, in a tourism wiki, the ''bed and breakfast" category might contain a see-also reference to the "self-catering" category.%0a%0a%25audience%25 administrators (intermediate)%0a!!The guts of the category markup%0aAs mentioned, all of the necessary markup features for Categories are enabled by default in
  current releases of PmWiki 2.0, but here's how they work for those who are interested.  The use of the Category group as the repository for all categories is determined by setting the $CategoryGroup variable, and the special [=[[!Subject]]=] markup is activated by a call to the Markup() function:%0a %0a-> [@SDV($CategoryGroup,'Category');%0aMarkup('[[!','%3clinks','/\[\[!([^\|\]] ?)\]\]/',%0a  "%3cspan class='category'>[[$CategoryGroup/$1]]%3c/span>");%0a@]%0a%0a%0a!!Coming up with good category schemes%0aThe hard part about using categories is choosing a good vocabulary. Site content managers may wish to follow the Guidelines for the establishment and development of monolingual thesauri (ISO 2788-1986) and the Guidelines for the establishment and development of multilingual thesauri (ISO 5964-1985). Questions to think about include:%0a* whether a scheme already exists and can be reused%0a* number of levels in a multilevel scheme (not too shallow, not too deep -- e.g. 3)%0a
 * number of categories per page (not too many, not too few -- e.g. 3)%0a* consistent use of singular ([@[[Mercury]] is a [[!planet]]@]) or plural ([@[[Mercury]] is in the [[!planets]] category@])%0a* disambiguation and use of phrases ([@[[!musical instruments]]@] and [@[[!medical instruments]]@])  or [[Cookbook:Subpage Markup]] ([@[[!Instruments*Musical]]@] and [@[[!Instruments*Medical]]@])%0a%0aOr you can just let people use whatever category terms they find meaningful. A vocabulary (or "folksonomy") will emerge over time.%0a%0a!! Contributors%0aRadu, John Rankin, `SolaRoofGuy, David A Spitzley%0a%0a%0a%25trail%25 %3c%3c|[[DocumentationIndex]]|>>%0a
+time=1180214677

Added: trunk/oggdsf/website/wikilib.d/PmWiki.ChangeLog
===================================================================
--- trunk/oggdsf/website/wikilib.d/PmWiki.ChangeLog	                        (rev 0)
+++ trunk/oggdsf/website/wikilib.d/PmWiki.ChangeLog	2008-04-28 00:13:04 UTC (rev 14803)
@@ -0,0 +1,11 @@
+version=pmwiki-2.2.0-beta64 ordered=1 urlencoded=1
+agent=pmwikiedit
+author=Pm
+charset=ISO-8859-1
+csum=
+host=74.200.73.46
+name=PmWiki.ChangeLog
+rev=844
+targets=PmWiki.DocumentationIndex,Cookbook.RecentChanges,PmWiki.MailingLists,PmWiki.WikiFarms,SiteAdmin.SiteAdmin,PmWiki.Version,SiteAdmin.Status,SiteAdmin.AuthList,PmWiki.PageTextVariables,PmWiki.Links,PmWiki.WikiStyles,PmWiki.PageLists,PmWiki.Forms,PmWiki.PageListTemplates,PmWiki.FAQ,Site.AuthList,PmWiki.Passwords,PmWiki.Skins,PmWiki.PageVariables,PmWiki.MarkupExpressions,Site.PageListTemplates,PmWiki.PageDirectives,PmWiki.ConditionalMarkup,PmWiki.AuthUser,PmWiki.PagelistVariables,PmWiki.Uploads,PmWiki.WikiTrails,PmWiki.TableDirectives
+text=(:Summary: Log of changes made to PmWiki by [[Release(Notes)]]:)%0a%25rfloat trail%25%3c%3c|[[Documentation Index]]|>>%25%25%0a%0aSee [[Cookbook/RecentChanges | the cookbook recent changes page]] for additional updates and activity by other developers, or join the [[PmWiki/MailingLists | pmwiki mailing lists]] to discuss feature development with us.%0a%0a!!!Version 2.2.0-beta65 (2007-11-17)%0a* Fix SiteAdmin.AuthList so that it defaults to list=all (reported by Roman).%0a* Fix pmwiki skin to include xmlns= attribute in %3chtml> tag (PITS:00989, reported by Mateusz Czaplinksi and Petko Yotov).%0a%0a!!!Version 2.2.0-beta64 (2007-11-13)%0a* Add times to PmWiki date parsing (e.g., 2007-08-09T12:22:04).%0a* Suppress warning from ini_set in diag.php (suggested by Petko).%0a* Fix handling of -> links in trails (reported by Eemeli Aro).%0a* Add .kml and .kmz as valid attachment types. %0a* Fix handling of [=&amp;=] in markup (PITS:00988, reported by Stirling Westrup).%0a* Fix d
 uplication of language markers in $XLLangs (PITS:00987, reported by Stirling Westrup).%0a* Correct typo in DRange() call in stdmarkup.php (reported by Stirling Westrup).%0a* Turn on error displays when diagnostics are enabled.%0a* Default PHP's pcre.backtrack_limit to at least 1000000.%0a%0a!!!Version 2.2.0-beta63 (2007-07-31)%0a* Added $SkinDirectivesPattern to allow adjustments to available skin directives (requested by Petko).%0a* Fix default permissions on Site.AuthUser and Site.AuthList (reported by Scott Connard).%0a* Add "monospace" to pmwiki.css default (reported by Joshua Timberman, with assistance from H. Fox)%0a* Fix problem with slashes in wildcards to name= and group= parameters (reported by Ian MacGregor).%0a%0a!!! Version 2.2.0-beta62 (2007-07-21)%0a* Fix bug in trails introduced by beta61 (reported by charlequin).%0a%0a!!! Version 2.2.0-beta61 (2007-07-19)%0a* Add ability to grab trails by section.%0a* Add an "ontrail" condition (from suggestions by charlequi
 n).%0a%0a!!!Version 2.2.0-beta59, 2.2.0-beta60 (2007-07-18)%0a* Fix problem with upgrade.php on [[wiki farms]] (reported by Scott Connard).%0a* Fix problem with distributed version of Site.AuthUser (reported by Jon Haupt).%0a%0a!!!Version 2.2.0-beta58 (2007-07-17)%0a* Significant change: Site.AuthUser, Site.Blocklist, Site.ApprovedUrls, and Site.NotifyList now appear in the [[SiteAdmin]] group by default.%0a** Note: if you limit groups by setting $GroupPattern, you now need to include SiteAdmin (see [[Cookbook:LimitWikiGroups]])%0a* Abort if ldap: authentication requested and libraries aren't present.%0a* Added "upgrades.php" script to handle various migration issues.%0a* Current PmWiki [[version]] is now held in [[SiteAdmin.Status]] .%0a* Fix ?action=postupload to follow ?action=upload settings.%0a* Improvements to [[SiteAdmin.AuthList]] page (suggestions and fixes from Ian MacGregor).%0a* Allow leading underscores in attachment names (requested by Christophe David).%0a%0a!
 !!Version 2.2.0-beta57 (2007-06-15)%0a* Fix AsSpacedUTF8() to work like AsSpaced() (reported by Petko).%0a* Qualify page links that contain parentheses (reported by Petko).%0a* Fix bug in [@(:input default $:var ... :)@] (reported by Crisses).%0a%0a!!!Version 2.2.0-beta56 (2007-06-13)%0a* Fix AsSpaced() to not add spaces before leading digit, and treat hyphenated digits as complete numbers.%0a* Fix infinite recursion in self-referencing [[page text variables]] (PITS:00915).%0a* Fix bug introduced in beta55 not handling end [[links|anchors]] correctly (reported by Roman).%0a%0a!!!Version 2.2.0-beta55 (2007-06-11)%0a* Fix attributes to [@(:input e_form:)@] (PITS:00387, re-reported by Crisses).%0a* UpdatePage() now calls StopWatch() to record posting.%0a* Display stopwatch output as part of redirect.%0a* Fix [[wiki styles]] bug when $EnableLinkPageRelative is set (reported by Petko).%0a* Revise TextSection() code to hopefully avoid %25newwin%25[[http://pcre.org/|pcre]] limits (
 reported by Kathryn Andersen, Knut Alboldt).%0a* Add wrap=inline and wrap=none options to [[page list(s#pagelistwrap)]].%0a%0a!!!Version 2.2.0-beta53, 2.2.0-beta54 (2007-06-02)%0a* Improve error message reporting for markup rules (suggestion by Knut Alboldt).%0a* Clean up more E_NOTICE warnings (reported by Ian MacGregor).%0a* Add focus= option to [=(:=][[forms|input]]:) controls.%0a* Added CSS [@.faqtoc@] class, to be able to display only the questions coming from the #includefaq [[page list template(s)]].%0a* Changed [[PmWiki.FAQ]] to use .faqtoc class.%0a* Fix bug in TextSection (PITS:00935, reported by Jean-Fabrice).%0a* Fix bug in [[page list(s#pagelisttrail)]] caching of trails.%0a%0a!!!Version 2.2.0-beta52 (2007-05-26)%0a* Add per-PageStore attributes (from a suggestion by Tobias Thelen).%0a* Add [@{$PasswdRead}@], [@{$PasswdEdit}@], etc. to display page password settings.%0a* Add [[Site.AuthList]] to display all password permissions on a site.%0a* Reorder $PageListFi
 lters slightly.%0a* Add "passwd=" option to [[page list(s#pagelistpasswd)]], to return only those pages that have some sort of [[password(s)]] attribute on them.%0a* Add line numbers to StopWatchHTML output.%0a* Clean up handling of $AuthCascade.%0a%0a!!!Version 2.2.0-beta51 (2007-05-23)%0a* Add fmt=count to [[page list(s#pagelistcount)]] (reminder from Hans).%0a* Ignore hidden files in [[skin(s)]] directories when searching for .tmpl (suggestion by Stephan Becker).%0a* Clean up queuing of pages to be updated in .pageindex .%0a* Reset $LinkTargets() at beginning of each UpdatePage() sequence.%0a%0a!!!Version 2.2.0-beta50 (2007-05-22)%0a* Fix HTML cache when drafts are enabled, or other recipes using CondAuth().%0a* Prevent [[page lists]] with protected pages from HTML cache.%0a%0a!!!Version 2.2.0-beta48, 2.2.0-beta49 (2007-05-21)%0a* Fix spurious value= attribute in %3ctextarea> tag generated by [@(:input textarea ... :)@].%0a* Allow either [@(:input default ...:)@] or [@(:i
 nput defaults ...:)@].%0a* Fix problem with page text variable handling in [@(:input defaults:)@].%0a* Allow either [@(:template default:)@] or [@(:template defaults:)@] in [[page list templates]].%0a* Fix a bug handling dates with suffixes (reported by Crisses).%0a%0a!!!Version 2.2.0-beta47 (2007-05-20)%0a* Fix bug with quote handling in [@(:include:)@] options (reported by Hans).%0a%0a!!!Version 2.2.0-beta46 (2007-05-19)%0a* Moved $PageTextVarPatterns definition from scripts/stdmarkup.php to pmwiki.php.%0a* Ignore Markup() rules that have unresolved $when parameters.%0a* Fix issue in authuser.php when $auth array isn't set (contributed by Ben Stallings).%0a* The [@(:include:)@] directive now performs template argument processing on the included text.%0a* Optimized [@(:pagelist:)@] slightly when sorting on [[page variables]].%0a* Refactored [@(:input ... :)@] markups.%0a* Added HandleDispatch(), which allows action handlers to easily redispatch to other actions (and add mes
 sages).%0a* Added FmtTemplateVars(), to perform various template-substitutions.%0a%0a%0a!!!Version 2.2.0-beta45 (2007-05-02)%0a* Update pmwiki's date parsing to use a common routine, recognizing dates within strings and restricting range to 1900-2039.%0a* Add additional parameter to "date" conditional.%0a* Add if= option to [[page list(s#pagelistif)]] (suggested by Crisses).%0a* Refactor code to use TextSection() and RetrieveAuthSection() functions.%0a* The value= parameter to [@(:input textarea:)@] now works properly (including values loaded from $InputValues).%0a* The [@(:input default:)@] directive now allows loading input control defaults from another page via the [@source=@] parameter.%0a* Remove automatic call to FmtPageName() in $ROSPatterns.  Add $ROEPatterns (from suggestions by JB and others).%0a* Fix minor variable bugs in scripts/crypt.php.%0a* Remove E_NOTICE errors (reported by Hans).%0a* Fix handling of page variables when pagename is empty or not provided.%0a
 * Add $EnableLinkPageRelative configuration option.%0a* Clean up handling of arguments to [@{(ftime ...)}@].%0a* Remove mailposts.php call in stdconfig.php (reported by Christophe David).%0a%0a!!!Version 2.2.0-beta44 (2007-04-16)%0a* Fix case conversion of U+027D and U+026B (reported by Petko).%0a* Add $FTimeFmt to set default formatting for [@{(ftime)}@].%0a* Add %25s conversion to [@{(ftime)}@] for systems that don't have it by default.%0a* Report an error if edit [[form(s)]] cannot be read (suggested by Hans).%0a* Don't report ?cannot acquire lockfile when simply browsing pages.%0a* Add $EnableReadOnly flag to signal when PmWiki is to be run in read-only mode.%0a%0a!!!Version 2.2.0-beta43 (2007-04-15)%0a* Update drafts code to add $EnablePublishAttr and change button labels when drafts are enabled (PITS:00755).%0a* Removed no-longer-needed 'compat1x.php' and 'mailposts.php' from distribution.%0a* Added $DraftRecentChangesFmt.%0a* Added "[[markup expressions]]" [@{(...)}@]
  into the core.%0a* Added charset= attribute to saved pages.%0a* Update pagelist.php and xlpage-utf-8.php to handle case-insensitive searches.%0a* Added some optimizations to phpdiff.php script to produce more useful history information.%0a%0a!!!Version 2.2.0-beta42 (2007-03-27)%0a* Fix a bug with order=title in pagelists (reported by Anno).%0a%0a!!!Version 2.2.0-beta41 (2007-03-26)%0a* Added $EnableWSPre option, which allows easy adjustment of the "leading space -> preformatted text" (or "whitespace") rule.%0a* Added a new "pre" wikistyle, to designate blocks that are to be treated as preformatted text.%0a%0a!!!Version 2.2.0-beta40 (2007-03-24)%0a* Fix bug with order=title in pagelists when using $Titlespaced (PITS:00906, reported by Feral).%0a* Report state of allow_url_fopen when downloads fail in blocklist.php.%0a%0a!!!Version 2.2.0-beta39 (2007-03-23)%0a* Allow page variable filters to appear as options in [@(:template defaults:)@] (reported by SteP).%0a* Updated [[Site
 .PageListTemplates]] to use [@(:template:)@] directives.%0a* Remove '#wikileft h1' and '#wikileft h5' from pmwiki default stylesheet.%0a%0a!!!Version 2.2.0-beta38 (2007-03-22)%0a* Strip control characters from $ChangeSummary.%0a* Fix problem with count=m..n where m..n is outside the range of available pages (reported by SteP).%0a* Allow [@(:template default ...:)@] to specify a class= option.%0a* [[PmWiki/PageDirectives#redirect|Redirect]] pagename can now include an anchor (PITS:00558)%0a%0a!!!Version 2.2.0-beta37 (2007-03-16)%0a* Allow an optional space after comma separators in wildcard patterns (reported by Han Baas).%0a%0a!!!Version 2.2.0-beta36 (2007-03-16)%0a* Allow nested [[page text variables]] to work, remove extraneous ENT_NOQUOTES parameter.%0a* Add new [@(:template ...:)@] directives for pagelist templates.%0a* Modify count= option to pagelists to allow for alternate ranges.%0a%0a!!!Version 2.2.0-beta35 (2007-03-05)%0a* Fix bug in [[conditional markup]] parsing 
 (reported by Christophe David).%0a%0a!!!Version 2.2.0-beta33, 2.2.0-beta34 (2007-03-01)%0a* Refactor wildcard handling into its own GlobToPCRE function.%0a* Allow negated wildcards for page variable filters in pagelists (PITS:00878, reported by Jiri)%0a* Fix wildcards so that spaces no longer separate patterns (use commas).%0a* Fix handling of '&amp;' prior to [@(:input:)@] and other directives (reported by Luigi).%0a* Adjust position of [@%25define=...%25@] [[wiki styles]] to occur after ampersands.%0a* Adjust copyright dates on many files.%0a* Allow spaces around text variable names in [[page text variable(s)]] markups.%0a%0a!!!Version 2.2.0-beta32 (2007-02-28)%0a* Fix erroneous $EnableCreole item in docs/sample-config.php (reported by Sigurd).%0a* Added [@(:elseif:)@] and [@(:else:)@] markups (PITS:00787).%0a* Fix global $Skin variable handling when using SetSkin from within markup.%0a* Make sure directives aren't treated like [[page text variables]] (reported by Petko).%
 0a* Remove call to ResolvePageName() from authuser.php .%0a* Simplify [[PmWiki/AuthUser#LDAP|LDAP]] authentication for Active Directory sites.%0a* Cache lowercase/uppercase patterns in AsSpacedUTF8().%0a%0a!!!Version 2.2.0-beta31 (2007-02-11)%0a* Fix bug with sorting on [[pagelist variables]] (reported by Kathryn Andersen).%0a%0a!!!Version 2.2.0-beta29, 2.2.0-beta30 (2007-02-09)%0a* MakePageName now uses the first matching entry of $PagePathFmt as the home page of groups without a home page.%0a* Add AsSpacedUTF8() to handle title spacing in utf-8 (PITS:00875, contributed by Petko, Celok)%0a* Fix $RequestedPage when running with utf-8.%0a* Add %3cmeta> content-type tag for utf-8.%0a* Add an experimental caching system for pagelists.%0a* Fix $SuffixPattern and link suffixes for utf-8 (PITS:00881, reported by ppip).%0a%0a!!!Version 2.2.0-beta28 (2007-02-03)%0a* Update blocklist.php so that all posted fields are checked for block values (PITS:00850).%0a%0a!!!Version 2.2.0-beta27
  (2007-01-25)%0a* Fix markup processing sequence for [@(:input default:), (:input select:)@], etc. (problem noted by Marc).%0a* Fix default value of [@order=@] parameter to MakePageList().%0a%0a!!!Version 2.2.0-beta26 (2007-01-23)%0a* Fix a bug where pagelist list= option had no effect when reading from trails (from an rss problem noted by Russ Fink).%0a%0a!!!Version 2.2.0-beta24, 2.2.0-beta25 (2007-01-22)%0a* Add a scripts/creole.php module for Creole markup (http://www.wikicreole.org/).%0a* Move WikiWords out of the core defaults -- can be enabled via $EnableWikiWords.%0a* Fix handling of WikiWords following & or #, as in [=&AElig; and #FFFF00=] (reported by Moni Kellermann).%0a* Adjust FormatTableRow() to support Creole-style tables (using single |'s).%0a* Update docs/sample-config.php with new configurations and options.%0a* Added code to allow Abort() to refer to additional information on pmwiki.org.%0a* Added $EnableSkinDiag, which checks templates for required %3c!--H
 TMLHeader--> and %3c!--HTMLFooter--> directives.%0a* Removed deprecated $BasicLayoutVars support from skins.php.%0a%0a!!!Version 2.2.0-beta22, 2.2.0-beta23 (2007-01-17)%0a* Added $EnableActions, to allow pmwiki.php to be included without generating output (from a suggestion by Wouter Groeneveld).%0a* Fix bug in "order=" option to [@(:pagelist:)@] (reported by Mike Bishop).%0a* Change DisplayStopWatch() function to StopWatchHTML().%0a* Allow multiple lines for markup:, wiki:, and page: template directives (reported by Marc)%0a%0a!!!Version 2.2.0-beta21 (2007-01-12)%0a* Fix %3cvspace> bug in searchresults output (PITS:00846, reported by M. Czaplinski, marc, and others).%0a* Fix numerous E_NOTICE warnings and incorrect constants (PITS:00853, contributed by AndrewFyfe).%0a%0a!!!Version 2.2.0-beta20 (2007-01-11)%0a* $FeedPageListOpt needs to be declared global in feeds.php.%0a* Add "404 Not Found" status code to ?invalid page name aborts (PITS:00854, suggested by Athan).%0a* Remo
 ve stale entries from $PageExistsCache when a new PageStore is added (reported by Hans).%0a%0a!!!Version 2.2.0-beta19 (2006-12-29)%0a* Have blocklist check $_POST['text'] only when it is set (from a report by Simon).%0a%0a!!!Version 2.2.0-beta18 (2006-12-28)%0a* Change $pagename parameter in UpdatePage() to be passed by reference (suggestion by J. Meijer).%0a* Fix $EnableRobotsCloakActions so that it works again with page variables.%0a* Add "XML Sitemaps" to $RobotPattern.%0a* Change $MetaRobots to return "nofollow,noindex" for non-existent pages.%0a* Prefer "404 Not Found" to "403 Forbidden" for [[(PmWiki:)robots]] attempting to do invalid actions on non-existent pages.%0a* Add rel='nofollow' to "create attachment" links.%0a* Added class='inputbox' to select boxes (suggested by Hans).%0a* Added .odt, .ods, and .odp file extensions to allowed [[uploads]] (suggested by Algis Kabaila, Robin Sheat, and others).%0a* Clean up some error warnings (PITS:00801, contributed by psvo).
 %0a* Set $ScriptUrl to 'https:' when accessed via SSL link (suggestions from C. Ridderstr&ouml;m, H. Fox, PITS:00410, PITS:00527, PITS:00595).%0a* Fix bug in link= and trail= options to [@(:pagelist:)@] (reported by C. Ridderstr&ouml;m).%0a%0a!!!Version 2.2.0-beta17 (2006-12-13)%0a* Fix spurious hidden field in [@(:searchbox:)@] output (reported by Hans).%0a* Fix $CaseConversions array for \xc4\xb1 and \xc5\xbf (reported by Petko Yotov).%0a* Refactor [@(:input:)@] markup handling.%0a* Add [@(:input select ...:)@] markup (PITS:00567).%0a* Add [@(:input default ...:)@] markup -- may change before 2.2.0 release.%0a* Add ability to set defaults for radio/checkbox/select controls.%0a%0a%0a!!!Version 2.2.0-beta16 (2006-11-10)%0a* Fix problem with [@(:e_preview:)@] directive when viewing an edit form (reported by Dominique Faure).%0a* Fix out-of-memory problem in scripts/compat1x.php when dealing with large pages to be converted (contributed by Donald Gordon).%0a* Fix problem of Va
 riable: lines immediately followed by newline (reported by Hans).%0a* Fix uninitialized variable errors in FormatTableRow() (reported by Bob Sanders).%0a* Fix second argument of MakeBaseName() (provided by Stirling Westrup).%0a%0a!!!Version 2.2.0-beta15 (2006-10-16)%0a* Fix bug with displaying multi-line [@(:var:value:)@] [[page text variables]] (reported by Pico).%0a* Improve PageStore ls() method slightly, to restrict pagename searches to directories of a given depth (based on an issue reported by Chris Cox).%0a* Added $IsBlocked status variable to scripts/blocklist.php.%0a* Added $UnapprovedLink array to report unapproved links.%0a* Added $TimeISOFmt, $TimeISOZFmt, and $CurrentTimeISO variables.%0a* Switched scripts/feeds.php to use $TimeISOZFmt instead of $ISOTimeFmt.%0a* Added [@request=@] option to [@(:pagelist:)@], switched pagelist to default to not use url/form parameters.%0a* Fixed bug with array [@{$$options}@] in pagelist.%0a%0a!!!Version 2.2.0-beta14 (2006-10-06
 )%0a* Fix problem with extra parameter to mail when $NotifyParameters is empty (reported by Tom Lederer).%0a* Improve configurability of $SearchPatterns (from suggestions by Stirling Westrup).%0a* Add ability for $WikiWordCount to disable wikiword spacing (PITS:00327).%0a%0a!!!Version 2.2.0-beta13 (2006-10-04)%0a* Fix handling of angle brackets (and potential XSS) in pagelists combined with page text variables (noted by Pico).%0a%0a!!!Version 2.2.0-beta12 (2006-10-03)%0a* Added the UpdatePage() function into the core.  %0a%0a!!!Version 2.2.0-beta11 (2006-10-03)%0a* Added ability to automatically create targets.%0a* Added sample code to docs/sample-config.php for automatic generation of Category.* pages.%0a* Fixed character escapes in pagelist [@{$$option}@] variables.%0a%0a!!!Version 2.2.0-beta10 (2006-10-02)%0a* Added [@{$$option}@] variables to get option values from [@(:pagelist:)@] (based on a recipe from Martin Fick).%0a* Changed [@{$PageCount}, {$GroupPageCount}, and {
 $GroupCount}@] to be [@{$$PageCount}, {$$GroupPageCount}, and {$$GroupCount}@].%0a* Added [@{$BaseName}@] page variable and $BaseNamePatterns.%0a%0a!!!Version 2.2.0-beta9 (2006-10-01)%0a* Fix bug with $EnablePageListProtect (reported by Brent Zupp).%0a* Added ability to select based on page variables in [@(:pagelist:)@].%0a%0a!!!Version 2.2.0-beta8 (2006-09-30)%0a* Update scripts/blocklist.php to check only $_POST['text'] instead of entire markup text.%0a* Fix bug in pagelist.php that wouldn't return correctly formatted array in certain circumstances (noted by Florian Fischer and JDem).%0a%0a!!!Version 2.2.0-beta7 (2006-09-30)%0a* Added scripts/blocklist.php to core.%0a* Updated handling of $PageTextVarPatterns.%0a* Eliminated need for extra flush() steps in notify.php, pagelist.php.%0a%0a!!!Version 2.2.0-beta6 (2006-09-27)%0a* Fix bug with initialization of $FeedPageListOpt in scripts/feeds.php (reported by Roman).%0a* Fix bug with over-eager [@(:textvar:value:)@] markup (f
 rom a bug reported by Chris Cox).%0a%0a!!!Version 2.2.0-beta4, 2.2.0-beta5 (2006-09-27)%0a* Fix bug with name= option in pagelist (reported by Ben Wilson).%0a* Fix bug with array_merge under PHP 5 (reported by Kathryn Andersen).%0a%0a!!!Version 2.2.0-beta3 (2006-09-26)%0a* Remove extra %3c!----> comment at end of table directives (noted by Ben Stallings).%0a* Fix directive form of page text variables (reported by Kathryn Andersen).%0a* Add first version of new modular pagelist code.%0a%0a!!!Version 2.2.0-beta2 (2006-09-25)%0a* Add support for [@{$:var}@] page text variables, and [@(:var:...:)@] markup.%0a* Fix default setting of $EnableRelativePageVars in docs/sample-config.php .%0a%0a!!!Version 2.2.0-beta1 (2006-09-25)%0a* Added [@{*$var}@] page variables (always the currently browsed page).%0a* Convert link and page variable handling in [=(:include:)=] to be relative to the included page.%0a* Added $EnableRelativePageVars and $EnableRelativePageLinks variables, as well as 
 transition options.%0a* Added basepage= option to [=(:include:)=].%0a* Updated $GroupHeaderFmt and $GroupFooterFmt to use basepage= option.%0a* Adjusted $MakePageNamePatterns to automatically strip any #... or ?... from the end of a pagename input string (solution to a problem reported by J. Meijer).%0a%0a!!!Version 2.1.27 (2006-12-11)%0a* Backport in bug fix for TableRowFormat (from 2.2.0-beta16).%0a* Add support for [@{*$Variable}@] syntax (from 2.2.0 page variables).%0a%0a!!!Version 2.1.26 (2006-09-11)%0a* Fix a bug with variable referencing that caused feeds.php to get a confused PCache (reported by Helge Larsen).%0a%0a!!!Version 2.1.25 (2006-09-08)%0a* Fixed a bug in authuser.php that would fail if $AuthUser isn't defined (reported by Hans Huijgen).%0a* Added %3c!--XMLHeader--> and %3c!--XMLFooter--> aliases to %3c!--HTMLHeader--> and %3c!--HTMLFooter--> directives in skin templates (suggested by John Rankin).%0a* Added $PageExistsCache (suggested by John Rankin).%0a%0a
 !!!Version 2.1.24 (2006-09-06)%0a* Fixed a bug in authuser.php that had trouble dealing with non-array entries in $AuthUser (reported by Udo).%0a* Can now specify authorization groups using $AuthUser['@group'] entries.%0a* Can now specify an Apache .htgroup-formatted file for authorization groups via $AuthUser['htgroup'].%0a%0a!!!Versions 2.1.21, 2.1.22, 2.1.23 (2006-09-05, 2006-09-06)%0a* Close a potential security hole with $FarmD when register_globals is set "On".%0a* Correct a syntax error in feeds.php (noted by Ben Wilson).%0a* Fix a bug that prevented PmWiki from reading page files generated by versions prior to 0.5.6 (discovered by Milan Avramovic).%0a%0a!!!Version 2.1.20 (2006-09-04)%0a* Fixed a bug in [[PageDirectives#attachlist| [@(:attachlist:)@] ]] when passed a wikiword argument (reported by Kathryn Andersen).%0a* Changed $HTMLStylesFmt['markup'] to honor config.php setting (reported by Hans).%0a%0a!!!Version 2.1.19 (2006-08-30)%0a* Corrected a bug in the pagein
 dex code that was causing the .pageindex to not update as quickly as it should.%0a* Slightly changed the handling of 'width' and 'height' in wikistyles.php, so that they can be be applied as attributes to %3cobject> and %3cembed> tags.%0a* Updated the Keep() function to recognize closing block tags as being in the 'B' block pool.%0a* Fixed a bug with wikistyles and form tags.%0a%0a!!!Version 2.1.18 (2006-08-28)%0a* Closed a potential cross-site scripting vulnerability in table markups (reported by JB).%0a* Added [@(:input image:)@] markup (requested by JB).%0a* Fixed problem with ?action=print failing to set [@{$Action}@] (reported by Bart).%0a%0a!!!Version 2.1.17 (2006-08-26)%0a* Added some improvements to IMS caching to better handle logout and authorization actions (PITS:00573, reported by floozy and Henrik Bechmann).%0a%0a!!!Version 2.1.16 (2006-08-26)%0a* Added $SkinLibDirs variable, to select filesystem and url locations where skins may be found (resolves PITS:00708, a
 s reported by Hagan Fox, with additional suggestions from Ben Wilson).%0a* Changed [@%3c!--HeaderText-->@] to [@%3c!--HTMLHeader-->@] in skin templates, and added an optional [@%3c!--HTMLFooter-->@] directive (PITS:00767).%0a* Adjusted the pmwiki and print skins to use the new directives.%0a%0a!!!Version 2.1.15 (2006-08-25)%0a* Fixed issue dealing with order of [@@_site_*@] passwords (reported by Jean-Fabrice and others).%0a* Added $LocalDir variable (requested by John Rankin).%0a* Removed an unnecessary setting of $DefaultPage in ''scripts/pgcust.php'' (it's now handled by ResolvePageName() ).%0a* Added some variables and changes in wikistyles.php to better support wikipublisher (contributed by John Rankin).%0a* RetrieveAuthPage (PmWikiAuth) now recognizes a $level of 'ALWAYS' as indicating that access should always be allowed, regardless of current passwords or identities.%0a* Added filter specifier for AuthUser LDAP authentication (contributed by Balu).%0a%0a!!!Version 2.
 1.13, 2.1.14 (2006-08-15, 2006-08-16)%0a* Updated scripts/authuser.php to allow ldaps://... authentications (contributed by Michael Brenner).%0a* Fixed problem with numeric passwords introduced in 2.1.beta20 (reported by Christophe David and Dirk Blaas).%0a%0a!!!Version 2.1.12 (2006-08-07)%0a* Corrected typo in Site.SideBar file (reported by Judith Zacharie).%0a* Suppressed warning message for search on sites without a wikilib.d/ directory.%0a* Added capability for nested divs.%0a* Use $Transition['nodivnest'] to restore previous non-nesting div/table behavior.%0a* Including authuser.php now automatically resolves pagename.%0a* Added [@(:noaction:)@] directive to turn off actions.%0a* Fixed bug in wikistyles prior to image blocks.%0a* Added white-space as allowed wikistyle (suggested by C. Ridderstr&#246;m).%0a* Allow colons, hyphens, and dots in id= tags.%0a%0a!!!Version 2.1.11 (2006-06-09)%0a* Fixed generation of empty paragraphs around [@%25define=...%25@] wikistyles (PIT
 S:00753).%0a%0a!!!Version 2.1.10 (2006-06-04)%0a* Added a %3cspan> around the RecentChanges link in the pmwiki skin (PITS:00750, suggested by Hagan Fox).%0a* Changed the $Action variable to $ActionTitle (PITS:00749, reported by Hagan Fox).%0a* Changed $FPLTemplatePageFmt to be an array of pages to be searched for page templates, enabled searching of current page and Site.LocalTemplates page.%0a* Updated .vspace margin in sidebar for pmwiki skin (PITS:00751, by Hagan Fox).%0a%0a%0a!!!Version 2.1.9 (2006-06-02)%0a* Fixed a bug with [@[[~Author]]@] links (PITS:00530 reported by Klonk, PITS:00611 reported by weijang, PITS:00671 reported by Stirling Westrup, and helpful clues provided by Clayton Curtis).%0a%0a!!!Version 2.1.8 (2006-06-01)%0a* Added ability to specify notification entries from ''local/config.php'' as well as Site.Notify (suggested by Christophe David).%0a* Fixed $Transition['vspace'] from 2.1.7.%0a%0a!!!Version 2.1.7 (2006-05-31)%0a* Adjusted width of edit form fo
 r IE browsers (contributed by Roman and H. Fox).%0a* Suppress authentication failure error from LDAP (PITS:00739).%0a* Fixed problem with invalid page names resulting in redirect loop (PITS:00723, reported by jojoo).%0a* Added "Group." and "Group/" page name syntax, resolving PITS:00736 (from a suggestion by Pico).%0a* Changed handling of "vspace" paragraphs.%0a* Fixed some XSS vulnerabilities in uploads.php and url links (reported by Moritz Naumann, http://moritz-naumann.com).%0a* Added notify.php script, allowing finer control of email notifications.%0a%0a!!!Version 2.1.6 (2006-05-22)%0a* Optimized performance of urlapprove.php.%0a* Added [@(:if auth xyz PageName:)@] syntax.%0a* Corrected XSS bug in trails.php.%0a* Slightly improved performance of free links.%0a* Restore ability to use hyphens in InterMap links (reported by Henrik Bechmann).%0a%0a!!!Version 2.1.4, 2.1.5 (2006-03-29)%0a* Fixed problem with pagelist-based feeds (PITS:00709, reported by Jon Haupt).%0a* Added 
 [@{$Action}@] page variable. (PITS:00696, reported by Sebastian Pipping).%0a* Added stripmagic() around variables submitted to authuser.php.%0a* Fixed problem with multi-term searches containing special characters (PITS:00713, reported by Leo).%0a* Switched [[PageDirectives#attachlist| [@(:attachlist:)@] ]] to use a natural case sort (suggested by H. Fox).%0a%0a!!!Version 2.1.3 (2006-03-17)%0a* Re-fixed problem with PHP 5.1.1 and lines= option to [@(:include:)@] (PITS:00620).%0a* Fixed empty LDAP password issue (reported by Thomas Lederer).%0a%0a!!!Version 2.1.2 (2006-03-16)%0a* Fixed %3ch1>/%3ch2> tag mismatches (PITS:00702, reported by Martin Hason).%0a* Fixed bug with $AllowPassword and "nopass" (reported by M. Weiner and bram brambring).%0a* Improved the speed of RSS and other web feeds when $EnablePageListProtect is not set.%0a%0a!!!Version 2.1.1 (2006-03-13)%0a* Fixed a bug with multiple authorization groups as a password (PITS:00699, reported by Ari Epstein).%0a* Upda
 ted the authorization code to be a bit more liberal with password/group settings.%0a* Updated PmWiki.FAQ page to be able to grab FAQ items from other pages in the documentation.%0a%0a!!Version 2.1.0 (2006-03-12)%0a* Many many documentation updates (special thanks to many authors).%0a* Allow trailing underscores in upload names (requested by Hans).%0a* Fixed 'ak_print' problem causing accesskey='a' for print (noted by Pico).%0a* Added code to make sure each anchor is generated only once per page (for XHTML validity).%0a* Added a $BlockPattern variable to recognize block HTML tags.%0a* Made an adjustment to Keep() so that it places strings with block HTML into the 'B' pool.%0a* Adjusted stdmarkup.php to not produce paragraphs for keep blocks in the 'B' pool.%0a* Corrected a variety of i18n phrases.%0a* Added class='escaped' to distinguish [=@@...@@=] from [=[@...@]=] (from a comment by Hans).%0a* Slightly changed styling of .faq divs.%0a* Made the edit textarea a couple of row
 s smaller to better fit on smaller displays (suggested by H. Fox).%0a%0a%0a!!!Version 2.1.beta38 (2006-03-09)%0a* Fixed auth bug in HandleSearchA (reported by noskule).%0a* Fixed print skin to be XHTML 1 compliant and use updated i18n phrases (PITS:00690, contributed by Athan).%0a* Fixed ?action=search to honor markup escapes when checking current page for ([==]:searchresults:).%0a* Fixed bug in handling blank lines in preformatted text.%0a* Fixed extra newlines appearing after [=[@...@]=] markups (reported by H. Fox).%0a* Added class= and caption= arguments for [@(:markup:)@] markup.%0a* Added apply=pre to wikistyles.%0a%0a!!!Version 2.1.beta37 (2006-03-08)%0a* Converted [@(:redirect:)@] to be a true markup, now honors conditional markup and includes. %0a* Added status= option to redirect.%0a* Allow redirecting to an anchor within a page (PITS:00558).%0a* Added experimental server-side page caching.%0a%0a!!!Version 2.1.beta36 (2006-03-06)%0a* Fixed problem with PmWiki under
  PHP 5.1.2 with lines= option to [@(:include:)@] (PITS:00620, thanks to Eric Wolleson for the fix).%0a* Added [@(:if exists PAGENAME:)@] conditional markup.%0a* Fixed bug with pages using 'nopass' as password (reported by H. Baas and J. Demartini).%0a%0a!!!Version 2.1.beta35 (2006-03-05)%0a* Revised authorization code to be faster/cleaner, and to support "@_site_edit"  authorization.%0a* Adjusted Site.SideBar so that edit permissions default to site's edit permissions.%0a%0a!!!Version 2.1.beta34 (2006-03-04)%0a* Updated the simuledit.php script so that an author won't lose edits when the merge fails (PITS:00391).%0a%0a!!!Version 2.1.beta33 (2006-03-02)%0a* Added transparent button images (PITS:00347, suggested by Klonk).%0a* Added some new button images to pub/guiedit, including a button "blank" for creating new buttons.%0a* Added $EditRedirectFmt option to allow save/cancel in ?action=edit to redirect somewhere other than the current page (PITS:00674, requested by T. Dowlin
 g).%0a* Restored lost scripts/.htaccess and docs/.htaccess files.%0a* Added [@{$Description}@] page variable, changed feeds.php to use this instead of [@$ItemDesc@].%0a* Added conditional expressions, based on cookbook recipe from D. Faure (PITS:00531).%0a%0a!!!Version 2.1.beta32 (2006-02-27)%0a* Fixed minor glitch with call to flush() in pagelist.php causing spurious "headers already sent" warnings (reported by Robin Sheat and others).%0a%0a!!!Version 2.1.beta31 (2006-02-26)%0a* Changed "inputbox" to "inputbutton" in [@(:searchbox:)@] directive (reported by Hans).%0a* Switched setting of $SkinDir to include a leading "./".%0a* Added option to suppress fields in ?action=attr display.%0a%0a!!!Version 2.1.beta30 (2006-02-25)%0a* Fixed bug with custom $SearchBoxFmt (noticed by Hans and Han Baas).%0a%0a!!!Version 2.1.beta29 (2006-02-24)%0a* Restored default setting of $EnablePageListProtect to 1 (was inadvertently switched to zero in beta27).%0a* Fixed "group=" option in [@(:sea
 rchbox:)@], and added ability to pass other options to search results.%0a* Added rule to ignore a blank line immediately following a heading (suggested by J. Durcholz and H. Fox).%0a* Revised pmwiki skin stylesheet (contributed by H. Fox)%0a* Added [@%3c!--PageActionFmt-->@] section to pmwiki skin.%0a* Added [@target=@] option to [@(:searchbox:)@].%0a* Added change to use the current page for ?action=search if it has @@[=(:=]searchresults:)@@ in the page's markup.%0a* $PageSearchForm can now be an array of pages to possibly be used to display the results of ?action=search -- first one found is used (suggested by Hans).%0a* Fixed bug with pageindex not including page's name in list of terms to search.%0a%0a!!!Version 2.1.beta27-28 (2006-02-24)%0a* Removed .linkindex, converted to .pageindex for faster word searches.%0a* Fixed bug with setting of $AuthId after logins.%0a* Added order=group for pagelists (requested by B. Boltwood)%0a* Added appropriate settings for magic_quotes
 _runtime and magic_quotes_sybase PHP settings.%0a* Fixed problem with include lines=... chopping off last line of text when fewer than requested lines in page.%0a* Updated handling of links to non-existent pages and query strings.%0a* Added some useful comments to scripts/feeds.php.%0a%0a%0a!!!Version 2.1.beta26 (2006-02-16)%0a* Changed PmWiki's default pmwiki.css styles to look a little cleaner in various browsers (suggestions from H. Fox).%0a* The [@(:include:)@] directive now supports a self=0|1 parameter to tell the directive if it should include the current page.%0a* $GroupHeaderFmt and $GroupFooterFmt now have "self=0" added to prevent their contents from being displayed twice.%0a* Page links with query arguments are now treated as "existing page" links even if the page does not exist (from suggestions by Jon Haupt).%0a* Modified scripts/author.php so that $Author is automatically set from $AuthId (unless overridden by a local config or by the author).%0a* Added [@orde
 r=random@] option to [@(:pagelist:)@].%0a* Added $Transition['fplbygroup'] to restore FPLByGroup function.%0a* Changed $EnableDefaultWikiStyles to $EnableWikiStyles.%0a* Added $UploadNameChars to allow customization of characters in upload filenames.%0a%0a%0a!!!Version 2.1.beta24-25 (2006-02-08)%0a* Improved interface to transition.php code to allow better granularity.%0a* Changed default of $EnableTransitions to 0.%0a* Fixed problem with [=(:markup:)=] closing divs (reported by H. Fox).%0a* Added $Action value for ?action=search (suggested by H. Fox).%0a* Added class=inputbox and class=inputbutton to various input controls (PITS:00577, suggested by H. Fox, Hans, and others).%0a* Fixed bug with "list=normal" when drafts enabled.%0a%0a!!!Version 2.1.beta23 (2006-02-07)%0a* Fixed bug with PageExists("") returning true (reported by Sebastian Siedentopf and others).%0a* Fixed $InterMapFiles to allow fmt substitutions.%0a* Removed unused $DiffAuthorPageExistsFmt and $DiffAuthorPa
 geMissingFmt from pagerev.php.%0a* Resolved some issues of "double-posts" and simultaneous edits.%0a* Added [@{$LastModifiedSummary}@] page variable.%0a* Allow spaces around '#' in [@[[target | # ]]@] links (suggested by Ryan Varick).%0a* Added docs/UPGRADE.txt (thanks to Hagan Fox).%0a* Added draft capabilities with $EnableDrafts = 1 .%0a* Changed default setting of $UploadUrlFmt to be based on $PubDirUrl (excellent suggestion by Hagan Fox).%0a* Removed problem of simultaneous edits interfering with reading of simple text files in wiki.d/ .%0a* Pressing "Save" with no text changes now actually performs a save.%0a%0a!!!Version 2.1.beta22 (2006-01-28)%0a* Fixed a bug in feeds.php with ?action=dc.%0a* Added code to be able to capture remainder of trail lines in trail index pages.%0a%0a!!!Version 2.1.beta21 (2006-01-27)%0a* Updated page variable code to better handle null values of $pagename.%0a* Improved guard against register_globals poisoning (courtesy of Francesco 'ascii' O
 ngaro).%0a* Added a %3cpubDate> tag to RSS feeds (from suggestions by Jean Demartini).%0a* Added wildcard capabilities for pagelists and conditional markups.%0a* Improved page-not-found handling, changed Site.PageNotFound (PITS:00556).%0a* Fixed bug in whitespace handling (reported by Christian Ridderstrom).%0a* Fixed handling of query strings and anchors in trail index pages.%0a* Null targets in links now produce null output.%0a%0a!!!Version 2.1.beta20 (2006-01-12)%0a* Redesigned/improved handling of session authorization variables.%0a* Suppressed warning from fileowner/filegroup in fixperms (courtesy Dominique Faure)%0a* Restored Last-Modified headers to algorithm used in 2.1.beta17, but the code now detects changes in configuration files and recipes.%0a* Added @@[=(=]:encrypt %3cphrase>:)@@ markup, to simplify generation of encrypted passwords in Site.AuthUser.%0a%0a!!!Version 2.1.beta18-19 (2006-01-10)%0a* Added 'class=' option to [@(:pagelist:)@] (based on suggestions f
 rom H. Bass).%0a* Changed `Site.InterMap to [@{$SiteGroup}.InterMap@].%0a* Fixed E_NOTICE errors.%0a* Corrected bug in $SaveAttrPatterns in scripts/stdmarkup.php.%0a* Removed $text global variable (use $_POST, $_GET, or $_REQUEST['text']).%0a* Removed saving of 'excerpt' attribute -- this is being reworked.%0a* Fixed bug with PageVar's handling of pagenames containing slashes (reported by Hans).%0a* Page action links in PmWiki skin no longer display with "non-existent page" decorations.%0a* Added more [[(PmWiki:)robots]] to $RobotPattern.%0a* Adjusted script to generate Last-Modified headers whenever $LastModFile is set.%0a* Added docs/ directory, several documentation files, and README.txt (courtesy H. Fox).%0a* Moved sample-config.php and COPYING to docs/ directory.%0a%0a!!!Version 2.1.beta16-17 (2005-12-29)%0a* Fixed bug with titled links (reported by blues).%0a* Restored $FPLFunctions variable.%0a* Restored [@(:if enabled:)@] conditional (PITS:00630).%0a* Fixed bug with 
 PCache.%0a* Added rel='nofollow' to various links where [[(PmWiki:)robots]] should not be going (suggestion by H. Fox).%0a%0a!!!Version 2.1.beta15 (2005-12-28)%0a* Removed Main.GroupAttributes and PmWiki.GroupAttributes from the distribution.%0a* Switched to using _crypt() for AuthUserConfig (requested by D. Faure).%0a* Fixed bug in httpauth.php with double-prompting for passwords (noted by M. Weiner).%0a* Added new page variables code, adding PageVar() function and redesigning FmtPageName().%0a* Added [[PmWiki.PageVariables]], removed PmWiki.MarkupVariables.%0a* Added [@(:if equal ...:)@].%0a* Optimized processing of includes and conditional markup.%0a* Optimized PCache().%0a* Removed deprecated $NewlineXXX variable.%0a* Added 'ctime' page attribute.%0a* Redesigned pagelist.php to use pagelist templates.%0a* Changed $EnablePageListProtect to default to 1.%0a* Added Site.PageListTemplates.%0a* Removed FPLByGroup, FPLSimple, and FPLGroup.%0a* Added more conversions to scripts
 /compat1x.php (suggested by C. Ridderstr&#246;m).%0a%0a!!!Version 2.1.beta13-14 (2005-12-10)%0a* Added scripts/feeds.php, which replaces scripts/rss.php (now removed from the distribution).%0a* Trail links are no longer saved as part of targets=.%0a* Keywords and description markup are saved as meta values in page files, along with an initial portion (excerpt) of the rendered HTML for a page.%0a%0a!!!Version 2.1.beta12 (2005-12-07)%0a* Fixed bug with storing group authorizations via ?action=attr (discovered by Dan Weber).%0a%0a!!!Version 2.1.beta11 (2005-12-06)%0a* Fixed problem with ?action=login for admin password (PITS:00612, reported by Klonk).%0a* Updated xlpage-utf-8.php for sites that have pcre installations that don't understand /u (reported by Andres Kulikauskas).%0a%0a!!!Version 2.1.beta10 (2005-12-05)%0a* Class attributes in wikistyles are now additive.%0a* Added capability for shared pages in farms (PITS:00459).%0a* Fixed XHTML validation problem for empty pageli
 sts (PITS:00601, reported by Mickael Nilsson).%0a%0a!!!Version 2.1.beta9 (2005-11-30)%0a* Added ?action=login.%0a%0a!!!Version 2.1.beta8 (2005-11-30)%0a* Fixed a problem with paragraphs after lists (reported by Bronwyn Boltwood).%0a* Added [[(PmWiki:)robot(s)]] controls to scripts/robots.php (PITS:00563).%0a%0a!!!Version 2.1.beta7 (2005-11-29)%0a* Added capability to load InterMap entries from Site.InterMap page (PITS:00522).%0a* Fixed bug with AuthList code (reported by Ilana Kingsley and others).%0a%0a!!!Version 2.1.beta6 (2005-11-29)%0a* Revised authuser.php to obtain configuration from Site.AuthUser page.%0a* Included capability for authorization groups.%0a%0a!!!Version 2.1.beta5 (2005-11-25)%0a* Fixed bug with read-protected Site.AuthForm (reported by Matt Strauser)%0a%0a!!!Version 2.1.beta4 (2005-11-24)%0a* Fixed bug with authentication after unsuccessful attempt (PITS:00551, reported by Uli and Bronwyn).%0a%0a!!!Version 2.1.beta3 (2005-11-23)%0a* Fixed bug with "id:*"
  authorization string (reported by Bronwyn).%0a%0a!!!Version 2.1.beta2 (2005-11-22)%0a* Fixed bug with formatting surrounding [=[@...@]=] code blocks.%0a* Added %3cspan class='wikiword'>...%3c/span> around wikiword links to provide additional wikiword formatting.%0a* Changed authorization prompt to default to Site.AuthForm.%0a* Revised PmWikiAuth function to be able to authorize against groups or multiple authentications.%0a* Fixed session handling in authorization code to create and open session only if needed.%0a* Fixed bug with display of directives in page history (PITS:00592, reported by floozy).%0a* Added [@white-space:nowrap@] to command section of pmwiki skin (PITS:00591, contributed by floozy).%0a* Fixed a possible bug with urls for direct-download attachments (PITS:00588, reported by Henning).%0a%0a!!!Version 2.1.beta1 (2005-11-18)%0a* WikiWords are now disabled by default (PITS:00520).%0a* Whitespace at the beginning of lines can be used for nesting within lists (
 PITS:00562).%0a* Added ability to specify percentages in wikistyles (use "pct" instead of "%25").%0a* Fixed problem with including to end of text (PITS:00560, thanks to Klonk).%0a* Added [@(:if enabled VAR:)@] conditional markup.%0a* Added [@[[target|+]]@] titled markup.%0a* Adjusted %3c/div> markup bug in [@(:markup:)@] (reported by Hans).%0a* Fixed problem of nested apostrophe markups (PITS:00590, reported by floozy).%0a* Added [@(:input file:)@] and $InputValues array (PITS:00566).%0a%0a!!!Version 2.0.13 (2005-11-10)%0a* Fixed PostPreview function to allow page preview even if page is saved.%0a* Fixed downloading code so that large files don't run into memory limits (reported by Daniel Scheibler).%0a* Changed urlapprove.php so that admins can always post.%0a* Fixed XSS bug in pagelist.php (reported by Mauritz Naumann, http://moritz-naumann.com).%0a%0a!!!Version 2.0.12 (19-Oct-2005)%0a* Fixed cast of $ApprovedUrlsFmt in transition.php (reported by Patrick Ogay).%0a* Change
 d PmWiki's exit() call to a return (PITS:00548, requested by Wesley Tanaka).%0a* Fixed bug that was erroneously converting '&amp;' back to '&' in query fragments (from a bug report by Chris Cox).%0a%0a!!!Version 2.0.11 (17-Oct-2005)%0a* Fixed problem with blank passwords in LDAP authentication (PITS:00547, reported by Paul Eden).%0a* Added support for whitespace indent rules.%0a* Fixed problem with losing history on changing passwords (PITS:00555, thanks to floozy).%0a* Added support for [@(:linebreaks:)@] and [@(:nolinebreaks:)@] (PITS:00549).%0a* Added support for `MySQL passwords in authuser.php (suggestions from Ahmed Ibrahim).%0a* Added an [@(:if date:)@] condition to the markup.%0a%0a!!!Version 2.0.10 (29-Sep-2005)\\%0aVersion 2.0.9 (28-Sep-2005)%0a* Fixed oversight in xlpage-utf-8.php that doesn't upcase ASCII letters when mb_strtoupper isn't present.%0a* Updated copyright dates.%0a%0a!!! Version 2.0.8 (27-Sep-2005)%0a* Changed $Name to $Title in print skin (found by 
 Robert Riebisch).%0a* Added capability to use quotes to enter pass phrases in ?action=attr (requested by Simon).%0a%0a!!! Version 2.0.7 (26-Sep-2005)%0a* Updated xlpage-utf-8.php to use a different case conversion algorithm, and completed tables for other character sets.%0a* Fixed $VersionNum variable.%0a* Added ak_textedit and default value of ',' (PITS:00528, offered by Christoph Lange).%0a* Added a time limit to generation of .linkindex files.%0a%0a!!! Version 2.0.6 (16-Sep-2005)%0a* Updated xlpage-utf-8.php so that mb_strtoupper() is no longer required.%0a* UTF-8 module now is able to handle UTF-8 characters in link suffixes (PITS:00432, reported by Schlaefer).%0a* Fixed a bug with vardoc.php when an empty $VarIndex is loaded (PITS:00491, reported by Jean-Dom).%0a* Improved the guiedit buttons for IE browsers -- selections now work more like one would hope they would (PITS:00515, suggested by floozy).%0a* Fixed %3cscript> tags for XHTML validation (PITS:00486, suggested 
 by Jocke).%0a* Improved author cookie handling with UTF-8 (PITS:00450, noted by Schlaefer)%0a* Fixed author special character handling (PITS:00524, from Dave G) %0a* Added $LogoutCookies to tell ?action=logout which cookies to expire.%0a* Added $CookiePrefix a prefix for cookies set by PmWiki scripts and recipes.%0a* Added $VersionNum numeric variable and ([@{$VersionNum}@] markup to make testing for specific versions easier.%0a%0a!!! Version 2.0.5 (9-Sep-2005)%0a* Cleaned up code for internationalization support.%0a* Added ?action=logout.%0a* Deprecated $Newline for good.  Sites that need $Newline set can use $NewlineXXX.%0a%0a!!! Version 2.0.4 (8-Sep-2005)%0a* Eliminated E_NOTICE warning from scripts/prefs.php (reported by Pierre-Marie Carette).%0a* Eliminated other E_NOTICE warnings in various other sections of code.%0a* Adjusted signature patterns (sequences of ~'s) to be more restrictive.%0a* Improved internationalization strings (PITS:00475, noted by Roman).%0a* Added 
 maximum length to change summaries (reported by H. Fox).%0a* Added speed improvements to link= in pagelist, $EnableLinkIndex option.%0a%0a!!! Version 2.0.3 (6-Sep-2005)%0a* Corrected default value settings in scripts/urlapprove.php.%0a* Fixed bug in setting of $sub in authuser.php (PITS:00509, reported by Alexandre B).%0a* Added change summaries into page history display.%0a* Fixed search pages and skin to use $SiteGroup instead of "Site" for search pages.%0a* Added additional attributes to input forms (suggested by Jo Durchholz).%0a%0a!!! Version 2.0.2 (3-Sep-2005)%0a%0a* Fixed bugs in mailposts.php (reported by M. Weiner and D. Scheibler)%0a* Fixed bug in PageStore removing whitespace from end of pages (reported by K. Chan)%0a* Added $EnablePageListProtect option to sample-config.php.%0a%0a!!! Version 2.0.1 (2-Sep-2005)%0a%0a* Temporarily restored setting of $Newline variable for recipes that need it.%0a* Fixed WikiTrail in PmWiki.PageDirectives (submitted by H. Fox).%0a%0
 a!!! [+Version 2.0.0 (1-Sep-2005)+]%0a%0a* Added `PCache() call for ?action=search (recommended by John Rankin).%0a* Added Path: `InterMap entry for relative urls in links.%0a* Set Site.SideBar to default to no password required for editing (suggested by Hans and others).%0a* Deleted pages are now named [=Group.PageName,del-1234567890=].%0a* Deprecated use of $Newline in `PageStore, now uses urlencoded newlines.%0a* Added new default skin -- old skin is at Cookbook:PmWikiV1Skin.%0a* Added default accesskey values in scripts/prefs.php.%0a* Fixed problem with extra spaces appearing around cells of simple tables (PITS:00402, reported by Klonk).%0a* Fixed problem with wikistyles in search strings (PITS:00495, reported by Radu).%0a* Updated print skin (PITS:00490, reported by Jungle).%0a* Fixed problem with url approvals being included multiple times, case sensitivity (PITS:00466 contributed by Simon).%0a* Added cookbook/.htaccess (suggested by H. Fox).%0a%0a!!!Version 2.0.beta55
  (25-Aug-2005)%0a* Added capability to retain previous versions of uploaded files (PITS:00386).%0a* Added LDAP authentication to authuser.php.%0a* Updated Q: and A: markups.%0a* Fixed bug with 'value=' style and numbered lists (reported by Crisses).%0a* Allow dots and parens in wikistyles.%0a* Fixed bug in link= parameter for pagelist markup (reported by W. Mueller).%0a* Changed handling of blank lines in wiki markup.%0a* Changed display characters of page history (suggestions from H. Fox).%0a* Adjusted handling of [=[@...@]=] markup.%0a* Fixed table cells to default to valign='top'.%0a* Fixed >>%3c%3c to generate (:divend:).%0a* Adjusted (:markup:) display.%0a* Added [@%25cframe%25@] wikistyle.%0a* Changed [@(:include:)@] markup to allow selection from multiple pages.%0a* Removed space that is generated as part of \\ joins.%0a%0a!!!Version 2.0.beta54 (1-Aug-2005)%0a* Fixed bug with handling of & in title, description, and keywords directives (reported by Anno).%0a* beta53 w
 as released without several commits; these are now committed.%0a%0a!!!Version 2.0.beta53 (30-Jul-2005)%0a* Added ?action=search, and adjusted search routines to use the new action.%0a%0a!!!Version 2.0.beta52 (29-Jul-2005)%0a* Fixed problem with multiple [@(:nl:)@] directives in sequence (reported by C. Ridderström).%0a* Fixed problem with [@(:markup:)@] appearing at beginning of page.%0a* Fixed problem with escaped-quotes in change summary (reported by J. Durchholz).%0a* Adjusted displayed image syntax%0a* Added float, frame, rfloat, lfloat, rframe, lframe, thumb wikistyles.%0a* Converted [@(:markup:)@] to use tables instead of divs.%0a* Fixed bug with center-aligned images.%0a* Added Content-Style-Type tag to pmwiki.tmpl (suggested by V. Krishn).%0a* Added title= attribute to image tags.%0a%0a!!!Version 2.0.beta51 (22-Jul-2005)%0a* Adjusted posting algorithm, added $Enable