<?php
   require_once(V3_ROOT . '/includes/v3.inc');

   v3_factory::load_module('templated_data');

   class runes extends v3_templated_data
   {
      protected $db    = null;
      protected $limit;

      protected function _init($args) # 0: $template [1: $limit]
      {
         $template    = isset($args[0]) ? $args[0] : '';
         $this->limit = isset($args[1]) ? $args[1] : 32;

         $this->set_template('runes', $template);

         $this->load();
      }

      public function load()
      {
         $start     = isset($_GET['start']) ? $_GET['start'] : 0;
         $db        = $this->_db;
         $st        = v3_factory::new_instance('path_sort');
         $num_found = 0;
         $limit     = 0;
         $data      = array(
            'navigation' => '',
            'nonsearch'  => '',
            'search'     => '',
            'runes'      => '',
            'sources'    => array(),
            'sitetitle'  => ''
         );
         $sources   = array_merge(glob('*.{inc,php,css,js,tpl}', GLOB_BRACE),
                                glob('../v3/includes/*.inc'));

         $st->sort($sources);

         foreach($sources as $file) {
            $data['sources'][] = array(
               'file' => basename($file)
            );
         }

         if(isset($_GET['search'])) {
            $_POST['searchstring'] = str_replace('__', '+', urldecode($_GET['search']));
         }
         if(!isset($_POST['searchstring'])) {
            $data['nonsearch'] = array();
            $this->limit  = 1024;
            $limit        = $this->limit + $start;
            $cres         = $db->query('SELECT COUNT(*) FROM `rundata`');
            $num_found    = mysql_result($cres, 0);
            $ss_link      = '/all';

            $res = $db->query(
               sprintf('SELECT `signum` FROM `rundata` ORDER BY `id` LIMIT %d,%d', $start, $this->limit)
            );
            $i = $start;
            while($row = $db->fetch_array($res)) {
               $sn = $row[0];

               $data['nonsearch'][$sn] = array(
                  'title' => $sn,
                  'url'   => '/search/' . urlencode("\"$sn\""),
                  'index' => sprintf('%04d', $i++)
               );
            }
         } else {
            $searchstring = preg_replace('/\s+/', ' ', stripslashes($_POST['searchstring']));
            $data['sitetitle'] = ' - ' . $searchstring;
            $query_ss     = preg_replace("/([^\\\\])(\\')/", '$1\$2', strtolower($searchstring));
            $query_sn_ss  = str_replace('"', '', $searchstring); 
            $MATCH_A      = 'MATCH (`signum`, `text_eng`, `text_run`, `text_fvn`, `text_nfs`, '.
                            '       `socken`, `haerad`, `ristare`, `oevrigt`) '.
                            "AGAINST ('$query_ss' IN BOOLEAN MODE)";
            $MATCH_B      = 'MATCH   (`bildlaenk`, `stilgruppering`, `perioddatering`, ' .
                            '         `materialfoeremaal`, `urspr-plats`, `placering`, ' .
                            '         `plats`, `referens`, `runtyper`, `korsform`) '.
                            "AGAINST ('$query_ss' IN BOOLEAN MODE)";
            $res          = $db->query(
               "SELECT *, ($MATCH_A + $MATCH_B) as score ".
               ' FROM `rundata` ' . 
               " WHERE $MATCH_A OR $MATCH_B OR `signum` LIKE '$query_sn_ss' ".
               ' ORDER BY score DESC'
            );
            $limit        = $this->limit + $start;
            $num_found    = mysql_num_rows($res);
            $count        = $start;
            $ss_link      = '/search/' . urlencode(str_replace('+', '__', $searchstring));

            $data['search'][0] = array(
               'string' => $searchstring,
               'found'  => $num_found
            );

            if($start > 0)
               $db->seek($res, $start);

            $found_runes  = array();

            while($row = $db->fetch_assoc($res)) {
               if($count < $limit) {
                  $count++;
                  $found_runes[$row['id']] = $this->_handle_row($row);;
               } else {
                  break;
               }
            }

            $data['runes'] = $found_runes;
         }

         if($start >= $this->limit) {
            $data['navigation'] = array(
               'first' => array(
                  'url'   => $ss_link . '/0',
                  'title' => '<< Första sidan',
                  'class' => 'first-link'
               ),
               'prev' => array(
                  'url'   => $ss_link . '/' . ($start - $this->limit),
                  'title' => '< Föregående sida',
                  'class' => 'prev-link'
               )
            );
         }

         if($limit < $num_found) {
            $data['navigation']['next'] = array(
               'url'   => $ss_link . '/' . ($start + $this->limit),
               'title' => 'Nästa sida >',
               'class' => 'next-link'
            );

            if($limit + $this->limit < $num_found) {
               $last = $limit;
               while($last + $this->limit < $num_found)
                  $last += $this->limit;
               $data['navigation']['last'] = array(
                  'url'   => $ss_link . '/' .  $last,
                  'title' => 'Sista sidan >>',
                  'class' => 'last-link'
               );
            }
         }
         $this->set_data($data);
      }

      protected function _handle_row($row)
      {
         $found_rune = $row;

         $found_rune['relevance'] = sprintf('%.2f', $row['score']);
         $found_rune['texts'] = array(
            'run' => array('title' => 'Runtext',              'content' => str_replace('"', '', $row['text_run'])),
            'eng' => array('title' => 'English',              'content' => str_replace('"', '', $row['text_eng'])),
            'fvn' => array('title' => 'Fornvästnordiska',     'content' => str_replace('"', '', $row['text_fvn'])),
            'nfs' => array('title' => 'Nationellt fornspråk', 'content' => str_replace('"', '', $row['text_nfs']))
         );

         if(strlen($row['bildlaenk'])) {
            $pics = preg_split('/,\s+/', $row['bildlaenk']);
            $found_rune['pics'] = array();
            foreach($pics as $url)
               $found_rune['pics'][] = array('url' => $url);
         } else {
            $found_rune['pics'] = '';
         }

         if(strlen($row['koordinater'])) {
            $found_rune['maplink']  = 'Visa på karta';
            $found_rune['mapinfo']  = sprintf("%s, %s.", $row['socken'], $row['haerad']);
            $found_rune['longitud'] = "'0'";

            if(preg_match("/(\\d{7})\\.(\\d{7})/", $row['koordinater'])) {
               $found_rune['latitud']  = "'" . urlencode(str_replace(' sn', '', $row['socken'])) . ", sweden'";
            } else if(preg_match("/[A-Z]{2}/", $row['koordinater'])) {
               $found_rune['latitud']  = "'" . $row['koordinater'] . "'";
            }
         }

         return $found_rune;
      }
   }
?>