<?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) {
$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;
}
}
?>