<?php
/**
 * DokuWiki Plugin ffindr (Syntax Component)
 *
 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
 * @author  Christian Schneider <cschneid@cschneid.com>
 */

// must be run within Dokuwiki
if (!defined('DOKU_INC')) die();

if (!defined('DOKU_LF')) define('DOKU_LF', "\n");
if (!defined('DOKU_TAB')) define('DOKU_TAB', "\t");
if (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');

require_once DOKU_PLUGIN.'syntax.php';
require_once(DOKU_INC.'inc/FeedParser.php');

class FFindrParser extends FeedParser {
    function FFindrParser() {
        parent::__construct();
        $this->set_item_class($class = 'FFindrParser_Item');
    }

    static function sort_items($a, $b) {
        return strcmp($a->get_tag('dateStart'), $b->get_tag('dateStart'));
    }
}

class FFindrParser_Item extends SimplePie_Item {
    function get_tag($name) {
        $tag = $this->get_item_tags("", $name);
        return $this->sanitize($tag[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
    }
}

class syntax_plugin_ffindr_ffindr extends DokuWiki_Syntax_Plugin {
    function getType() {
        return 'substition';
    }

    function getPType() {
        return 'block';
    }

    function getSort() {
        return 310;
    }

    function connectTo($mode) {
        $this->Lexer->addSpecialPattern('{{ffindr>.*?}}',$mode,'plugin_ffindr_ffindr');
    }

    function handle($match, $dummy_state, $dummy_pos, &$dummy_handler){
        $data = array();
        $match = substr($match, 9, -2);
        list($url, $dummy_header)   = explode('|', $match, 2);
        list($url, $params) = explode(' ', $url, 2);

        foreach (explode(' ', $params) as $param) {
            list($key, $value) = explode('=', $param, 2);
            if ($value)
                $data[$key] = $value;
            else
                $format[] = $key;
        }

        $format = array_filter((array)$format);

        return $data + array(
            'url' => $url,
            'max' => 100,
            'format' => $format ? $format : explode(' ', "date title location"),
        );
    }

    function render($mode, &$renderer, $data) {
        if($mode != 'xhtml') return false;

        if ($data['url']) {
            $feed = new FFindrParser();
            $feed->set_feed_url($data['url']);
            // disable warning while fetching
            if (!defined('DOKU_E_LEVEL'))
                $elvl = error_reporting(E_ERROR);
            $rc = $feed->init();
            if (!defined('DOKU_E_LEVEL'))
              error_reporting($elvl);

            // decide on start and end
            $max = max(1, intval($data['max'] - 1));
            if ($data['sort'] == "reverse") {
                $start = $feed->get_item_quantity() - 1;
                $end   = max(0, $start - $max);
                $step = -1;
            } else {
                $start = 0;
                $end   = min($max, $feed->get_item_quantity() - 1);
                $step   = 1;
            }

            if($rc) {
                $dateformat = "%d.%m.";
                $renderer->doc .= '<table class="inline">';

                foreach (range($start, $end, $step) as $i) {
                    $item = $feed->get_item($i);
                    $renderer->doc .= '<tr>';

                    foreach ($data['format'] as $cell) {
                        $renderer->doc .= "<td>";

                        switch (trim($cell)) {
                        case 'date': {
                            $renderer->doc .= strftime($dateformat, strtotime($item->get_tag('dateStart'))) . "&nbsp;-&nbsp;" . strftime($dateformat, strtotime($item->get_tag('dateEnd')));
                            break;
                        }

                        case 'title': {
                            // support feeds without links
                            if ($linkurl = $item->get_permalink()) {
                                // title is escaped by SimplePie, we unescape here because it
                                // is escaped again in externallink() FS#1705
                                $renderer->externallink($linkurl, htmlspecialchars_decode($item->get_title()));
                            }
                            else
                                $renderer->doc .= $item->get_title();
                            break;
                        }

                        case  'author': {
                            if ($author = $item->get_author(0)) {
                                $name = $author->get_name();
                                if(!$name)
                                    $name = $author->get_email();
                                if($name)
                                    $renderer->doc .= $lang['by'].' '.$name ;
                            }
                            break;
                        }

                        case  'location': {
                            $renderer->doc .= '<a href="http://' . ($item->get_tag('country') == "Switzerland" ? "map.search.ch/" : "maps.google.com?q=") . $item->get_latitude() . "," . $item->get_longitude() . '">' . $item->get_tag('location') . "</a>";
                            break;
                        }
                        }

                        $renderer->doc .= "</td>";
                    }

                    $renderer->doc .= "</tr>\n";
                }

                $renderer->doc .= "</table>";
            } else {
                $renderer->doc .= '<ul><li><div class="li"><em>'.$lang['rssfailed'].'</em>';
                $renderer->externallink($data['url']);
                if($GLOBALS['conf']['allowdebug'])
                    $renderer->doc .= '<!--' . hsc($feed->error) . '-->';
                $renderer->doc .= '</div></li></ul>';
            }
        } else
            $renderer->doc .= '<div class="ffindr">No FFindr URL specified</div>';

        return true;
    }
}

// vim:ts=4:sw=4:et:
