phpDocumentor ycwp-qr-me
[ class tree: ycwp-qr-me ] [ index: ycwp-qr-me ] [ all elements ]

Source for file class.ycwp_qrme.php

Documentation is available at class.ycwp_qrme.php

  1. <?php
  2. /*
  3. Plugin Name: YCWP QR Me
  4. Description: Generate QR Code images
  5. Version: 1.0
  6. License: GPL v2 or later
  7. License URI: http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
  8. Author: Nicola Mustone <mail@nicolamustone.it>
  9. Author URI: http://www.nicolamustone.it
  10. */
  11.  
  12. /*
  13. Copyright 2012 Nicola Mustone (mail@nicolamustone.it)
  14.  
  15. This program is free software; you can redistribute it and/or modify
  16. it under the terms of the GNU General Public License as published by
  17. the Free Software Foundation; either version 2 of the License, or
  18. (at your option) any later version.
  19.  
  20. This program is distributed in the hope that it will be useful,
  21. but WITHOUT ANY WARRANTY; without even the implied warranty of
  22. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  23. GNU General Public License for more details.
  24.  
  25. You should have received a copy of the GNU General Public License
  26. along with this program; if not, write to the Free Software
  27. Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  28. */
  29.  
  30. /**
  31.  * @see QRCode
  32.  */
  33. require_once'class.qrcode.php' );
  34. /**
  35.  * @see YCWP_QR_Me_Widget
  36.  */
  37. include_once'qrme.widget.php' );
  38.  
  39.  
  40. /**
  41.  * This class can handle qr code images through QRCode class (class.qrcode.php).
  42.  * It uses Google Charts APIs to generate QR Code image used in blog posts.
  43.  *
  44.  * @author Nicola Mustone <mail@nicolamustone.it>
  45.  * @copyright Copyright (c) 2012 Nicola Mustone
  46.  * @version 1.1
  47.  * @package ycwp-qr-me
  48.  */
  49. class YCWP_QR_Me {
  50.     /**
  51.      * YCWP QR Me version
  52.      *
  53.      * @var string 
  54.      */
  55.     const VERSION '1.1';
  56.     
  57.     /**
  58.      * QRCode class instance
  59.      *
  60.      * @var object 
  61.      * @access private
  62.      * @see QRCode
  63.      * @since 1.0
  64.      */
  65.     private $_qr;
  66.     
  67.     /**
  68.      * Post permalink
  69.      *
  70.      * @var string 
  71.      * @access private
  72.      * @since 1.0
  73.      */
  74.     private $_the_permalink;
  75.     
  76.     /**
  77.      * Post title
  78.      *
  79.      * @var string 
  80.      * @access private
  81.      * @since 1.0
  82.      */
  83.     private $_the_title;
  84.     
  85.     /**
  86.      * QR Codes id
  87.      *
  88.      * @var int 
  89.      * @access private
  90.      * @since 1.0
  91.      */
  92.     private $_id;
  93.     
  94.     /**
  95.      * Initializes properties, sets filters, actions and shortcodes
  96.      *
  97.      * @since 1.0
  98.      */
  99.     public function __construct({
  100.         //Properties initialization
  101.         $this->_qr = null;
  102.         $this->_the_permalink = '';
  103.         $this->_the_title = '';
  104.         $this->_id = 0;
  105.         
  106.         //Localization initialization
  107.         add_action'init'array&$this'ycwp_qrme_localize' ) );
  108.         
  109.         //Filter functions
  110.         add_filter'the_content'array&$this'ycwp_qrme_print_image' ) );
  111.         add_filter'the_permalink'array&$this'ycwp_qrme_retrive_post_permalink' ) );
  112.         add_filter'the_title'array&$this'ycwp_qrme_retrive_post_title' ) );
  113.         
  114.         //Set activation hook.
  115.         register_activation_hook__FILE__array&$this'ycwp_qrme_set_defaults_on_init' ) );
  116.         //Initialize option group in backend.
  117.         add_action'admin_init'array&$this'ycwp_qrme_register_opt_group' ) );
  118.         //Add the option page link.
  119.         add_action'admin_menu'array&$this'ycwp_qrme_option_page' ) );
  120.         //Add custom scripts.
  121.         add_action'wp_enqueue_scripts'array&$this'ycwp_qrme_enqueue_stuff' ) );
  122.         //Add the shortcode
  123.         add_shortcode'qrme'array&$this'ycwp_qrme_shortcode' ) );
  124.         
  125.         
  126.         //Initialize the class QRCode
  127.         $this->_qr = new QRCode();
  128.         $this->_qr->setContent$this->_the_permalink );
  129.     }
  130.     
  131.     /**
  132.      * Enqueue jQuery scripts
  133.      *
  134.      * @return void 
  135.      * @since 1.0
  136.      */
  137.     public function ycwp_qrme_enqueue_stuff({
  138.         wp_enqueue_script'jquery' );
  139.         wp_enqueue_script'jquery-easing'WP_PLUGIN_URL 'ycwp-qrme/js/jquery-easing1.3.js'array'jquery' )'1.3' );
  140.         
  141.         //Looks first for user's style
  142.         iffile_existsTEMPLATEPATH '/ycwp-qrme.css' ) ) {
  143.             $css get_template_directory_uri('/ycwp-qrme.css';
  144.         else {
  145.             $css WP_PLUGIN_URL '/ycwp-qrme/css/ycwp-qrme.css';
  146.         }
  147.         
  148.         wp_enqueue_style'ycwp-qrme-style'$cssfalseself::VERSION'screen' );
  149.     }
  150.     
  151.     /**
  152.      * Adds an option page
  153.      *
  154.      * @since 1.0
  155.      */
  156.     public function ycwp_qrme_option_page({
  157.         add_options_page'YCWP QR Me options''YCWP QR Me''administrator''ycwp-qrme-options'array&$this'ycwp_qrme_option_form' ) );
  158.         add_filter'plugin_action_links'array&$this'ycwp_qrme_settings_link' )10);
  159.     }
  160.     
  161.     /**
  162.      * Adds the Settings link to the plugin activation page
  163.      *
  164.      * @since 1.0
  165.      */
  166.     public function ycwp_qrme_settings_link$links$file {
  167.         $link '<a href="options-general.php?page=ycwp-qrme-options">' __'Settings''ycwp-qrme' .'</a>';
  168.         array_unshift$links$link );
  169.         
  170.         return $links;
  171.     }
  172.     
  173.     /**
  174.      * Retrives the permalink of the current post
  175.      *
  176.      * @since 1.0
  177.      */
  178.     public function ycwp_qrme_retrive_post_permalink$the_permalink {
  179.         $this->_the_permalink = $the_permalink;
  180.         return $the_permalink;
  181.     }
  182.     
  183.     /**
  184.      * Retrives the title of the current post
  185.      *
  186.      * @since 1.0
  187.      */
  188.     public function ycwp_qrme_retrive_post_title$the_title {
  189.         $this->_the_title = $the_title;
  190.         return $the_title;
  191.     }
  192.     
  193.     /**
  194.      * Defines the defaults values for the plugin.
  195.      *
  196.      * @since 1.0
  197.      */
  198.     public function ycwp_qrme_set_defaults_on_init({
  199.         add_option'ycwp_qrme_size'$this->_qr->_width );
  200.         add_option'ycwp_qrme_error'$this->_qr->_settings['chld');
  201.         add_option'ycwp_qrme_classes'' ' );
  202.         add_option'ycwp_qrme_add_to_the_content''true' );
  203.         add_option'ycwp_qrme_only_posts''false' );
  204.         add_option'ycwp_qrme_hide''true' );
  205.         add_option'ycwp_qrme_effect''fade' );
  206.     }
  207.     
  208.     /**
  209.      * Registers plugin options
  210.      *
  211.      * @since 1.0
  212.      */
  213.     public function ycwp_qrme_register_opt_group({
  214.         register_setting'ycwp_qrme_opt_group''ycwp_qrme_size' );
  215.         register_setting'ycwp_qrme_opt_group''ycwp_qrme_error' );
  216.         register_setting'ycwp_qrme_opt_group''ycwp_qrme_classes' );
  217.         register_setting'ycwp_qrme_opt_group''ycwp_qrme_add_to_the_content' );
  218.         register_setting'ycwp_qrme_opt_group''ycwp_qrme_only_posts' );
  219.         register_setting'ycwp_qrme_opt_group''ycwp_qrme_hide' );
  220.         register_setting'ycwp_qrme_opt_group''ycwp_qrme_effect' );
  221.     }
  222.     
  223.     /**
  224.      * Localizes the plugin
  225.      *
  226.      * @since 1.0
  227.      */
  228.     public function ycwp_qrme_localize({
  229.         load_plugin_textdomain'ycwp-qrme'falsebasenamedirname__FILE__ ) ) '/i18n' );
  230.     }
  231.     
  232.     /**
  233.      * Print a QR Code image
  234.      *
  235.      * @param string $content 
  236.      * @return string 
  237.      * @version 1.1
  238.      * @since 1.0
  239.      */
  240.     public function ycwp_qrme_print_image$content {
  241.         if( ( !is_single(AND !is_home(AND !is_category(AND !is_archive(AND !is_tag() ) OR is_search(AND is_page() ) ) {
  242.             return $content;
  243.         }
  244.         
  245.         $return $content;
  246.         $add_to_content get_option'ycwp_qrme_add_to_the_content' );
  247.         $only_posts get_option'ycwp_qrme_only_posts' );
  248.         
  249.         if$add_to_content === 'true' {
  250.             if$only_posts === 'true' AND !is_single() ) {
  251.                 return $return;
  252.             else {
  253.                 return $this->ycwp_qrme_add_qr_code$return );
  254.             }
  255.         }
  256.         
  257.         return $content;
  258.     }
  259.     
  260.     /**
  261.      * Prints a QR Code using a shortcode.
  262.      *
  263.      * Examples:
  264.      * - [qrme]http://www.example.com[/qrme]
  265.      * - [qrme content="http://www.example.com"]
  266.      *
  267.      * Examples with all optional attributes:
  268.      * - [qrme size="200" error="L" class="my-custom-class" title="My Example website" alt="A QR Code for my link"]http://www.example.com[/qrme]
  269.      * - [qrme size="200" error="L" class="my-custom-class" title="My Example website" alt="A QR Code for my link" content="http://www.example.com"]
  270.      * 
  271.      * @since 1.0
  272.      */
  273.     public function ycwp_qrme_shortcode$atts$content null {
  274.         $this->_id++;
  275.         
  276.         $attrs shortcode_attsarray(
  277.             'size' => get_option'ycwp_qrme_size' ),
  278.             'error' => get_option'ycwp_qrme_error' ),
  279.             'content' => $this->_the_permalink,
  280.             'class' => '',
  281.             'title' => $this->_the_title,
  282.             'alt' => ''
  283.         )$atts );
  284.         
  285.         $qr $this->_qr;
  286.         
  287.         $params preg_replace'/[^\w\-]/'' '$attrs['class');
  288.         $params array(
  289.             'class' => $params ' ycwp-qrme-image',
  290.             'alt' => $this->_the_permalink,
  291.             'title' => $attrs['title'],
  292.             'alt' => $attrs['alt'],
  293.             'id' => $this->_id
  294.         );
  295.         
  296.         ifempty$params['class') ) {
  297.             unset$params['class');
  298.         }
  299.         
  300.         ifis_null$content ) ) {
  301.             $content $attrs['content'];
  302.         }
  303.         
  304.         $qr->setSize$attrs['size']$attrs['size');
  305.         $qr->setErrorLevel$attrs['error');
  306.         $qr->setContent$content );
  307.         
  308.         $image $qr->QR_POST$params );
  309.         
  310.         $return  $this->_id < $this->_ycwp_qrme_make_style_js('';
  311.         $return .= '<div class="ycwp-qrme-box">';
  312.         $return .= '<a href="void: javascript" title="Toggle QR Code" alt="Toggle QR Code" class="ycwp-qrme-toggle"></a><br />';
  313.         $return .= $image;
  314.         $return .= '</div>';
  315.         
  316.         return $content $return;
  317.     }
  318.     
  319.     /**
  320.      * Add a QR Code image to the post content.
  321.      *
  322.      * @param string $content 
  323.      * @return $string 
  324.      * @since 1.0
  325.      */
  326.     public function ycwp_qrme_add_qr_code$content {
  327.         $qr $this->_qr;
  328.         $size get_option'ycwp_qrme_size' );
  329.         
  330.         $params preg_replace'/[^\w\-,]/'''get_option'ycwp_qrme_classes' ) );
  331.         $params array(
  332.             'class' => str_replace','' '$params ' ycwp-qrme-image',
  333.             'alt' => 'QR Code',
  334.             'title' => $this->_the_title
  335.         );
  336.         
  337.         $qr->setSize$size$size );
  338.         $qr->setErrorLevelget_option'ycwp_qrme_error' ) );
  339.         $qr->setContent$this->_the_permalink );
  340.         
  341.         $image $qr->QR_POST$params );
  342.         
  343.         $return  $this->_id < $this->_ycwp_qrme_make_style_js('';
  344.         $return .= '<div class="ycwp-qrme-box">';
  345.         $return .= '<a href="void: javascript" title="Toggle QR Code" alt="Toggle QR Code" class="ycwp-qrme-toggle"></a><br />';
  346.         $return .= $image;
  347.         $return .= '</div>';
  348.         
  349.         return $content $return;
  350.     }
  351.     
  352.     /**
  353.      * Prints a options form
  354.      *
  355.      * @since 1.0
  356.      */
  357.     public function ycwp_qrme_option_form({
  358.         ?>
  359.         <script type="text/javascript">
  360.         jQuery( document ).ready( function( $ ) {
  361.             if( !$( '#ycwp_qrme_add_to_the_content' ).is( ':checked' ) ) {
  362.                 $( '#ycwp_qrme_only_posts' ).attr( 'disabled', 'disabled' );
  363.                 $( '#ycwp_qrme_hide' ).attr( 'disabled', 'disabled' );
  364.             }
  365.                 
  366.             $( '#ycwp_qrme_add_to_the_content' ).click( function() {
  367.             
  368.                 if( !$( '#ycwp_qrme_add_to_the_content' ).is( ':checked' ) ) {
  369.                     $( '#ycwp_qrme_only_posts' ).attr( 'disabled', 'disabled' );
  370.                     $( '#ycwp_qrme_hide' ).attr( 'disabled', 'disabled' );
  371.                 } else {
  372.                     $( '#ycwp_qrme_only_posts' ).attr( 'checked', false );
  373.                     $( '#ycwp_qrme_only_posts' ).removeAttr( 'disabled' );
  374.                     
  375.                     $( '#ycwp_qrme_hide' ).attr( 'checked', false );
  376.                     $( '#ycwp_qrme_hide' ).removeAttr( 'disabled' );
  377.                 }
  378.                 
  379.             } );
  380.         });
  381.         </script>
  382.         <div class="wrap">
  383.             <div class="icon32" id="icon-options-general"></div>
  384.             <h2><?php _e'YCWP QR Me Configuration''ycwp-qrme' )?></h2>
  385.             
  386.             <form method="post" action="options.php">
  387.                 <?php settings_fields'ycwp_qrme_opt_group' )?>
  388.                 <table class="form-table">
  389.                     <tbody>
  390.                         <tr valign="top">
  391.                             <th scope="row">
  392.                                 <label for="ycwp_qrme_size"><?php _e'Image size''ycwp-qrme' )?>:</label>
  393.                             </th>
  394.                             <td>
  395.                                 <select name="ycwp_qrme_size" id="ycwp_qrme_size">
  396.                                     <option value="100" <?php selectedget_option'ycwp_qrme_size')'100' )?>>100x100 px</option>
  397.                                     <option value="150" <?php selectedget_option'ycwp_qrme_size')'150' )?>>150x150 px</option>
  398.                                     <option value="200" <?php selectedget_option'ycwp_qrme_size')'200' )?>>200x200 px</option>
  399.                                     <option value="250" <?php selectedget_option'ycwp_qrme_size')'250' )?>>250x250 px</option>
  400.                                     <option value="300" <?php selectedget_option'ycwp_qrme_size')'300' )?>>300x300 px</option>
  401.                                 </select>
  402.                                 <span class="description"><?php _e'QR Code image size ( 200x200px raccomanded )''ycwp-qrme' )?>.</span>
  403.                             </td>
  404.                         </tr>
  405.                         <tr valign="top">
  406.                             <th scope="row">
  407.                                 <label for="ycwp_qrme_error"><?php _e'Error correction level''ycwp-qrme' )?>:</label>
  408.                             </th>
  409.                             <td>
  410.                                 <select name="ycwp_qrme_error" id="ycwp_qrme_error">
  411.                                     <option value="L" <?php selectedget_option'ycwp_qrme_error' )'L' )?>>L</option>
  412.                                     <option value="M" <?php selectedget_option'ycwp_qrme_error' )'M' )?>>M</option>
  413.                                     <option value="Q" <?php selectedget_option'ycwp_qrme_error' )'Q' )?>>Q</option>
  414.                                     <option value="H" <?php selectedget_option'ycwp_qrme_error' )'H' )?>>H</option>
  415.                                 </select>
  416.                                 <br /><span class="description"><?php _e'L = 7% of codewords can be restored''ycwp-qrme' )?>.</span>
  417.                                 <br /><span class="description"><?php _e'M = 15% of codewords can be restored''ycwp-qrme' )?>.</span>
  418.                                 <br /><span class="description"><?php _e'Q = 25% of codewords can be restored''ycwp-qrme' )?>.</span>
  419.                                 <br /><span class="description"><?php _e'H = 30% of codewords can be restored''ycwp-qrme' )?>.</span>
  420.                             </td>
  421.                         </tr>
  422.                         <tr valign="top">
  423.                             <th scope="row">
  424.                                 <label for="ycwp_qrme_classes"><?php _e'Additional image classes''ycwp-qrme' )?>:</label>
  425.                             </th>
  426.                             <td>
  427.                                 <input type="text" name="ycwp_qrme_classes" id="ycwp_qrme_classes" value="<?php echo get_option'ycwp_qrme_classes' )?>" />
  428.                                 <span class="description"><?php _e'Comma separated classes and only <strong>alphanumeric chars</strong>, <strong>-</strong> and <strong>_</strong>''ycwp-qrme' )?></span>
  429.                             </td>
  430.                         </tr>
  431.                         <tr valign="top">
  432.                             <th scope="row">
  433.                                 <label for="ycwp_qrme_add_to_the_content"><?php _e'Add QR Code to posts content''ycwp-qrme' )?>:</label>
  434.                             </th>
  435.                             <td>
  436.                                 <input type="checkbox" name="ycwp_qrme_add_to_the_content" id="ycwp_qrme_add_to_the_content" value="true" <?php checked (get_option'ycwp_qrme_add_to_the_content' )'true' )?> />
  437.                             </td>
  438.                         </tr>
  439.                         <tr valign="top">
  440.                             <th scope="row">
  441.                                 <label for="ycwp_qrme_only_posts"><?php _e'Display QR Code only on single posts page''ycwp-qrme' )?>:</label>
  442.                             </th>
  443.                             <td>
  444.                                 <input type="checkbox" name="ycwp_qrme_only_posts" id="ycwp_qrme_only_posts" value="true" <?php checked (get_option'ycwp_qrme_only_posts' )'true' )?> />
  445.                                 <span class="description"><?php _e'If checked, only shows QR Code on posts page''ycwp-qrme' )?>.</span>
  446.                             </td>
  447.                         </tr>
  448.                         <tr valign="top">
  449.                             <th scope="row">
  450.                                 <label for="ycwp_qrme_hide"><?php _e'Hide on startup''ycwp-qrme' )?>:</label>
  451.                             </th>
  452.                             <td>
  453.                                 <input type="checkbox" name="ycwp_qrme_hide" id="ycwp_qrme_hide" value="true" <?php checked (get_option'ycwp_qrme_hide' )'true' )?> />
  454.                                 <span class="description"><?php _e'If checked, only display a link to show the QR Code, also for shortcodes''ycwp-qrme' )?>.</span>
  455.                             </td>
  456.                         </tr>
  457.                         <tr valign="top">
  458.                             <th scope="row">
  459.                                 <label for="ycwp_qrme_effect"><?php _e'Show/Hide effect''ycwp-qrme' )?>:</label>
  460.                             </th>
  461.                             <td>
  462.                                 <select name="ycwp_qrme_effect" id="ycwp_qrme_effect">
  463.                                     <option value="fade" <?php selectedget_option'ycwp_qrme_effect' )'fade' )?>>fade</option>
  464.                                     <option value="slide" <?php selectedget_option'ycwp_qrme_effect' )'slide' )?>>slide</option>
  465.                                     <option value="no_effect" <?php selectedget_option'ycwp_qrme_effect' )'no_effect' )?>>no effect</option>
  466.                                 </select>
  467.                                 <span class="description"><?php _e'jQuery effect''ycwp-qrme' )?>.</span>
  468.                             </td>
  469.                         </tr>
  470.                         <tr valign="top">
  471.                             <th scope="row"></th>
  472.                             <td>
  473.                                 <input type="submit" id="submit" name="submit" value="<?php _e'Save''ycwp-qrme' )?>" />
  474.                             </td>
  475.                         </tr>
  476.                     </tbody>
  477.                 </table>
  478.             </form>
  479.         </div>
  480.         <?php
  481.     }
  482.     
  483.     /**
  484.      * Print jQuery code for show/hide effect
  485.      *
  486.      * @return string 
  487.      * @since 1.0
  488.      */
  489.     private function _ycwp_qrme_make_style_js({
  490.         switchget_option'ycwp_qrme_effect' ) ) {
  491.             case 'fade':       $effect 'fade';               break;
  492.             case 'slide':      $effect 'slide';              break;
  493.             case 'no_effect':  $effect 'no_effect';          break;
  494.             default:           $effect 'fade';
  495.         }
  496.         
  497.         if$effect == 'fade' {
  498.             $toggle_function '
  499.             $( ".ycwp-qrme-toggle" ).click( function() {
  500.                 $(this).parent().find( ".ycwp-qrme-image").fadeToggle( "slow" );
  501.                 $(this).text( $(this).text() == "' __'Show QR Code''ycwp-qrme' '" ? "' __'Hide QR Code''ycwp-qrme' '" : "' __'Show QR Code''ycwp-qrme' '" );
  502.             });';
  503.         else if$effect == 'slide' {
  504.             $toggle_function '
  505.             $( ".ycwp-qrme-toggle" ).click( function() {
  506.                 $(this).parent().find( ".ycwp-qrme-image").slideToggle( "slow" );
  507.                 $(this).text( $(this).text() == "' __'Show QR Code''ycwp-qrme' '" ? "' __'Hide QR Code''ycwp-qrme' '" : "' __'Show QR Code''ycwp-qrme' '" );
  508.             });';
  509.         else if$effect == 'no_effect' {
  510.             $toggle_function '
  511.             $( ".ycwp-qrme-toggle" ).click( function() {
  512.                 $(this).parent().find( ".ycwp-qrme-image").toggle();
  513.                 $(this).text( $(this).text() == "' __'Show QR Code''ycwp-qrme' '" ? "' __'Hide QR Code''ycwp-qrme' '" : "' __'Show QR Code''ycwp-qrme' '" );
  514.             });';
  515.         }
  516.         
  517.         $style_js '
  518.         <script type="text/javascript">
  519.         var ycwp_qrme_hide = "' get_option'ycwp_qrme_hide' .'";
  520.         
  521.         jQuery( document ).ready( function( $ ) {
  522.             var hide_on_startup = false;
  523.             
  524.             if( ycwp_qrme_hide == "true" ) {
  525.                 hide_on_startup = true;
  526.                 $( ".ycwp-qrme-image" ).hide();
  527.             }
  528.             
  529.             if( hide_on_startup ) {
  530.                 $( ".ycwp-qrme-toggle" ).text( "' __'Show QR Code''ycwp-qrme' '" );
  531.             } else {
  532.                 $( ".ycwp-qrme-toggle" ).text( "' __'Hide QR Code''ycwp-qrme' '" );
  533.             }
  534.             
  535.             ' $toggle_function '
  536.         });
  537.         </script>';
  538.         
  539.         $style_js .= '
  540.         <style>
  541.         .ycwp-qrme-box {
  542.             width: ' get_option'ycwp_qrme_size' 'px;
  543.         }
  544.         </style>';
  545.         
  546.         return $style_js;
  547.     }
  548. }
  549.  
  550. /**
  551.  * Starts the plugin!
  552.  */
  553. ifclass_exists'QRCode' AND class_exists'YCWP_QR_Me' ) ) {
  554.     $YCWP_QR_Me new YCWP_QR_Me();
  555. }
  556. ?>

Documentation generated on Tue, 21 Feb 2012 23:39:35 +0100 by phpDocumentor 1.4.3