                          Apache Shindig PHP

  What is it?
  -----------

  Shindig is a JavaScript container and implementations of the backend APIs
  and proxy required for hosting OpenSocial applications.

  This is the PHP implementation of Shindig. If you are looking to the Java 
  implementation, please visit our website.

  Documentation
  -------------

  The most up-to-date documentation can be found at http://shindig.apache.org/
  and at http://shindig.apache.org/developers/php/index.html 
  for specific PHP documentation.

  Read javascript/README for instructions for using the Shindig Gadget 
  Container JavaScript to enable your page to render Gadgets.

  Release Notes
  -------------

  The full list of changes can be found at https://issues.apache.org/jira/browse/SHINDIG.

  System Requirements
  -------------------

  PHP:
    5.2.x or above with the json, simplexml, mcrypt and curl extentions 
    enabled.
  Web server:
    Apache with mod_rewrite enabled.
  Memory:
    No minimum requirement.
  Disk:
    No minimum requirement. 
  Operating System:
    No minimum requirement. On Windows, Windows NT and above or Cygwin is 
    required for the startup scripts. Tested on Windows XP, Fedora Core 
    and Mac OS X.

  Installing Shindig
  ------------------

  Unzip the distribution archive, i.e. shindig-${project.version}-php.zip to 
  the web document root, e.g. /var/www/html. 

  Rename the created shindig-${project.version}-php dir to shindig. 

  a. Create a new virtual host

  Point your Apache to the shindig dir with a virtual host like:

  <VirtualHost your_ip:your_port>
         ServerName your.host
         DocumentRoot /var/www/html/shindig
         ... other normal settings in vhosts...
    <Directory>
      AllowOverride All
    </Directory>
  </VirtualHost>

  Restart apache, and point your browser to:

  http://<your.host>/gadgets/ifr?url=http://www.labpixies.com/campaigns/todo/todo.xml

  b. Run with an existing host

  If you cannot/don't want to create a virtual host, you can edit the file 
  php/config/container.php or php/config/local.php (see the comments 
  php/config/container.php for documentation of the configuration system) 
  and change the web_prefix setting to '/shindig/php'.

  In this case, you should also change all paths in shindig/config/container.js
  (see the comments there for documentation of the JSON configuration system).

  Then you can run the gadget by pointing your browser to:

  http://<your.host>/shindig/php/gadgets/ifr?url=http://www.labpixies.com/campaigns/todo/todo.xml

  Going forward
  -------------
  
  Check out the php/config/container.php file, in local.php you only have 
  to specificy the fields you want to overwrite with other values, for 
  example on a production system you would probably want to have something
  like:
   $shindigConfig = array(
    'debug' => false,
    'allow_plaintext_token' => false,
    'token_cipher_key' => 'MySecretKey',
    'token_hmac_key' => 'MyOtherSecret',
    'private_key_phrase' => 'MyCertificatePassword',
    'person_service' => 'MyPeopleService',
    'activity_service' => 'MyActivitiesService',
    'app_data_service' => 'MyAppDataService',
    'messages_service' => 'MyMessagesService',
    'oauth_lookup_service' => 'MyOAuthLookupService'
    'xrds_location' => 'http://www.mycontainer.com/xrds',
    'check_file_exists' => false
   );
 
  And then implement your own service and oauth lookup classes.

  Running from an svn checkout
  ---------

  If you want to run PHP Shindig directly from an svn checkout, please refer to the
  docs/README.svn file to learn about the configuration differences between the released
  and svn version. 

  Licensing
  ---------

  Please see the file called LICENSE.

  Shindig URLS
  ------------

  Home Page:          http://shindig.apache.org/
  Downloads:          http://shindig.apache.org/download/index.html
  Mailing Lists:      http://shindig.apache.org/mail-lists.html
  Source Code:        http://svn.apache.org/repos/asf/shindig/
  Issue Tracking:     https://issues.apache.org/jira/browse/SHINDIG
  Wiki:               http://cwiki.apache.org/confluence/display/SHINDIG/

This distribution includes cryptographic software.  The country in
which you currently reside may have restrictions on the import,
possession, use, and/or re-export to another country, of
encryption software.  BEFORE using any encryption software, please
check your country's laws, regulations and policies concerning the
import, possession, or use, and re-export of encryption software, to
see if this is permitted.  See <http://www.wassenaar.org/> for more
information.

The U.S. Government Department of Commerce, Bureau of Industry and
Security (BIS), has classified this software as Export Commodity
Control Number (ECCN) 5D002.C.1, which includes information security
software using or performing cryptographic functions with asymmetric
algorithms.  The form and manner of this Apache Software Foundation
distribution makes it eligible for export under the License Exception
ENC Technology Software Unrestricted (TSU) exception (see the BIS
Export Administration Regulations, Section 740.13) for both object
code and source code.

The following provides more details on the included cryptographic
software:

    Apache Shindig PHP interfaces with the mcrypt API
    <http://mcrypt.sourceforge.net/> to provide encryption
    of messages using the AES standard.

