<?php 
/**
* @version		$Id: images.engine.php 2512 2023-04-29 11:32:36Z IOS $
* @package		Elxis
* @subpackage	Component Search
* @copyright	Copyright (c) 2006-2023 Elxis CMS (https://www.elxis.org). All rights reserved.
* @license		Elxis Public License ( https://www.elxis.org/elxis-public-license.html )
* @author		Elxis Team ( https://www.elxis.org )
* @description 	Elxis CMS is free software. Read the license for copyright notices and details
*/

defined('_ELXIS_') or die ('Direct access to this location is not allowed');


class imagesEngine implements searchEngine {

	private $options = array('q' => '', 'size' => '', 'time' => 0, 'type' => '', 'ordering' => 'r');		
	private $dosearch = false;
	private $total = 0;
	private $limit = 10;
	private $limitstart = 0;
	private $page = 1;
	private $maxpage = 1;
	private $results = array();
	private $columns = 1;
	private $year = 0;
	private $month = 0;
	private $search_into = 0; //0: content, 1: filesystem, 2: both
	private $search_dirs = array();


	/********************/
	/* MAGIC CONTRUCTOR */
	/********************/
	public function __construct($params) {
		$this->limit = (int)$params->get('limit', 10);
		if ($this->limit < 1) { $this->limit = 10; }
		$this->columns = (int)$params->get('columns', 1);
		if ($this->columns < 1) { $this->columns = 1; }
		if ($this->columns > 2) { $this->columns = 2; }
		$this->search_into = (int)$params->get('search_into', 0);
		if ($this->search_into < 0) { $this->search_into = 0; }
		if ($this->search_into > 2) { $this->search_into = 0; }
		if ($this->search_into > 0) {
			for ($i = 1; $i < 11; $i++) {
				$dir = trim($params->get('dir'.$i, ''));
				if (($dir != '') && ($dir != '/')) {
					$dir = trim($dir, '/').'/';
					if (file_exists(ELXIS_PATH.'/'.$dir) && is_dir(ELXIS_PATH.'/'.$dir)) {
						$this->search_dirs[] = $dir;
					}
				}
			}
		}

		$this->options['ordering'] = $params->get('ordering', 'r');
		if (($this->options['ordering'] == '') || !in_array($this->options['ordering'], array('r', 'ta', 'td', 'sa', 'sd', 'da', 'dd'))) {
			$this->options['ordering'] = 'r';
		}

		$this->setOptions();
	}


	/***********************************/
	/* SET SEARCH OPTIONS FROM THE URL */
	/***********************************/
	private function setOptions() {
		$elxis = eFactory::getElxis();

		$pat = "#([\']|[\;]|[\.]|[\"]|[\$]|[\/]|[\#]|[\<]|[\>]|[\*]|[\~]|[\`]|[\^]|[\|]|[\\\])#u";
		$pat = "#([\']|[\;]|[\.]|[\"]|[\$]|[\/]|[\|]|[\=]|[\#]|[\<]|[\>]|[\*]|[\~]|[\`]|[\^]|[\|]|[\\\])#u";
		if (isset($_GET['q'])) {
			$q = urldecode($elxis->sanitizeInput('q', INPUT_GET, true, false));
			$q = eUTF::trim(preg_replace($pat, '', $q));
			if (eUTF::strlen($q) > 3) { $this->options['q'] = $q; $this->dosearch = true; }			
		}
		if (isset($_GET['size'])) {
			$size = trim($elxis->sanitizeInput('size', INPUT_GET));
			if (in_array($size, array('xs', 's', 'm', 'l', 'xl'))) {
				$this->options['size'] = $size;
				$this->dosearch = true;
			}
		}

		if (isset($_GET['time'])) {
			$time = (int)$_GET['time'];
			if ($time > 0) {
				if ($time < 365) {
					$this->options['time'] = $time;
					$this->dosearch = true;
				} else {
					$t = (string)$time;
					if (strlen($t) == 4) {
						if (($time > 1970) && ($time <= date('Y'))) { //valid year
							$this->options['time'] = $time;
							$this->year = $time;
							$this->month = 0;
							$this->dosearch = true;
						}
					} else if (strlen($t) == 6) {
						$y = intval(substr($t, 0, 4));
						$m = intval(substr($t, -2));
						$m2 = sprintf("%02d", $m);
						if (($y > 1970) && ($m > 0) && ($m < 13) && ($y.$m2 <= date('Ym'))) { //valid year & month
							$this->year = $y;
							$this->month = $m2;
							$this->options['time'] = $y.$this->month;
							$this->dosearch = true;
						}
						unset($y, $m, $m2);
					}
				}
			}
		}

		if (isset($_GET['type'])) {
			$type = trim($elxis->sanitizeInput('type', INPUT_GET));
			if (in_array($type, array('jpg', 'png', 'gif', 'bmp', 'svg'))) {
				$this->options['type'] = $type;
				$this->dosearch = true;
			}
		}

		if (isset($_GET['ordering'])) {
			$ordering = trim($elxis->sanitizeInput('ordering', INPUT_GET));
			if (in_array($ordering, array('r', 'ta', 'td', 'sd', 'sa', 'dd', 'da'))) {
				$this->options['ordering'] = $ordering;
			}
		}
	}


	/********************/
	/* MAKE SEARCH FORM */
	/********************/
	public function searchForm() {
		$eURI = eFactory::getURI();
		$eLang = eFactory::getLang();

		$isssl = $eURI->detectSSL();
		$action = $eURI->makeURL('search:images.html', '', $isssl);

		elxisLoader::loadFile('includes/libraries/elxis/form5.class.php');

		$form = new elxis5Form(array('idprefix' => 'simg', 'labelclass' => 'elx5_label', 'sideclass' => 'elx5_labelside'));
		$form->openForm(array('name' => 'fmsearchimages', 'method' => 'get', 'action' => $action, 'id' => 'fmsearchimages'));

		$form->openFieldset($eLang->get('SEARCH_OPTIONS'));
		$form->addNote($eLang->get('LEAST_ONE_CRITERIA'), 'elx5_formtext');

		$form->addText('q', $this->options['q'], $eLang->get('KEYWORD'), array('maxlength' => 80, 'placeholder' => $eLang->get('KEYWORD')));

		if ($this->columns == 2) {
			$form->addHTML('<div class="elx5_2colwrap">');
			$form->addHTML('<div class="elx5_2colbox">');
		}

		$options = array();
		$options[] = $form->makeOption('', $eLang->get('ANY'));
		$options[] = $form->makeOption('xs', $eLang->get('EXTRA_SMALL'));
		$options[] = $form->makeOption('s', $eLang->get('SMALL'));
		$options[] = $form->makeOption('m', $eLang->get('MEDIUM'));
		$options[] = $form->makeOption('l', $eLang->get('LARGE'));
		$options[] = $form->makeOption('xl', $eLang->get('EXTRA_LARGE'));
		$form->addSelect('size', $eLang->get('SIZE'), $this->options['size'], $options);

		$options = array();
		$options[] = $form->makeOption(0, $eLang->get('ANY_TIME'));
		$options[] = $form->makeOption(1, $eLang->get('LAST_24_HOURS'));
		$options[] = $form->makeOption(2, $eLang->get('LAST_2_DAYS'));
		$options[] = $form->makeOption(10, $eLang->get('LAST_10_DAYS'));
		$options[] = $form->makeOption(30, $eLang->get('LAST_30_DAYS'));
		$options[] = $form->makeOption(90, $eLang->get('LAST_3_MONTHS'));
		$options[] = $form->makeOption(date('Ym'), $eLang->get('THIS_MONTH'));
		$years = array();
		$end = (($this->year > 0) && ($this->year < 2010)) ? $this->year : 2010;
		for ($i = date('Y'); $i >= $end; $i--) { $years[] = $i; }
		foreach ($years as $year) {
			$txt = ($year == date('Y')) ? $eLang->get('THIS_YEAR') : $year;
			$options[] = $form->makeOption($year, $txt);
			if (($this->year == $year) && ($this->month > 0)) {
				$monthname = eFactory::getDate()->monthName($this->month);
				$options[] = $form->makeOption($year.$this->month, $monthname.' '.$year);
			}
		}
		$form->addSelect('time', $eLang->get('DATE'), $this->options['time'], $options);
		unset($years, $end, $options);

		if ($this->columns == 2) {
			$form->addHTML('</div><div class="elx5_2colbox">');
		}

		$options = array();
		$options[] = $form->makeOption('', $eLang->get('ANY'));
		$options[] = $form->makeOption('jpg', 'JPG');
		$options[] = $form->makeOption('png', 'PNG');
		$options[] = $form->makeOption('gif', 'GIF');
		$options[] = $form->makeOption('bmp', 'BMP');
		//$options[] = $form->makeOption('svg', 'SVG');
		$form->addSelect('type', $eLang->get('FILETYPE'), $this->options['type'], $options, array('dir' => 'ltr'));

		$options = array();
		$options[] = $form->makeOption('r', $eLang->get('RELEVANCY'));
		$options[] = $form->makeOption('ta', $eLang->get('TITLE_ASC'));
		$options[] = $form->makeOption('td', $eLang->get('TITLE_DSC'));
		$options[] = $form->makeOption('sd', $eLang->get('BIGGER_FIRST'));
		$options[] = $form->makeOption('sa', $eLang->get('SMALLER_FIRST'));
		$options[] = $form->makeOption('dd', $eLang->get('NEWER_FIRST'));
		$options[] = $form->makeOption('da', $eLang->get('OLDER_FIRST'));
		$form->addSelect('ordering', $eLang->get('ORDERING'), $this->options['ordering'], $options);
		if ($this->columns == 2) {
			$form->addHTML('</div></div>');
		}

		$sidepad = ($this->columns == 2) ? 0 : 1;
		$form->addHTML('<div class="elx5_vspace">');
		$form->addButton('sbm', $eLang->get('SEARCH'), 'submit', array('class' => 'elx5_btn elx5_sucbtn', 'sidepad' => $sidepad));
		$form->addHTML('</div>');

		$form->closeFieldset();
		unset($form, $options);
	}


	/**************************/
	/* GET ENGINE'S META INFO */
	/**************************/
	public function engineInfo() {
		$eLang = eFactory::getLang();
		$elxis = eFactory::getElxis();
		$info = array(
			'title' => $eLang->get('IMAGES'),
			'description' => sprintf($eLang->get('SEARCH_IMAGES_DESC'), $elxis->getConfig('SITENAME')),
			'metakeys' => array(
				$eLang->get('SEARCH'), 
				$eLang->get('IMAGES'), 
				'PNG images',
				'JPG images',
				'GIF images',
				'image gallery',
				'OpenSearch',
				$eLang->get('KEYWORD'),
				$eLang->get('FILETYPE'),
				$eLang->get('SIZE'),
				'elxis images search'
			)
		);

		return $info;
	}


	/**************************/
	/* PROCESS SEARCH REQUEST */
	/**************************/
	public function search($page=1) {
		$page = (int)$page;
		if ($page < 1) { $page = 1; }
		$this->total = 0;
		$this->limitstart = 0;
		$this->page = $page;
		$this->maxpage = 1;
		$this->results = array();
		if ($this->dosearch == false) { return false; }

		if ($this->search_into == 0) {
			$results = $this->searchContentImages();
		} else if ($this->search_into == 1) {
			$results = $this->searchFileImages();
		} else {
			$rowsc = $this->searchContentImages();
			$rowsf = $this->searchFileImages();
			//we may have double images but can be prevented by the user by choosing correct search directories.
			$results = array_merge($rowsc, $rowsf);
			unset($rowsc, $rowsf);
		}

		if ($results) {
			$this->total = count($results);
			usort($results, array($this, 'sortResults'));
			$this->results = $this->limitResults($results, $page);
			return $this->total;
		}
		return 0;
	}


	/*******************************/
	/* GET NUMBER OF TOTAL RESULTS */
	/*******************************/
	public function getTotal() {
		return $this->total;
	}


	/********************/
	/* GET SEARCH LIMIT */
	/********************/
	public function getLimit() {
		return $this->limit;
	}


	/**************************/
	/* GET SEARCH LIMIT START */
	/**************************/
	public function getLimitStart() {
		return $this->limitstart;
	}


	/***************************/
	/* GET CURRENT PAGE NUMBER */
	/***************************/
	public function getPage() {
		return $this->page;
	}


	/***************************/
	/* GET MAXIMUM PAGE NUMBER */
	/***************************/
	public function getMaxPage() {
		return $this->maxpage;
	}


	/****************************/
	/* GET SEARCH OPTIONS ARRAY */
	/****************************/
	public function getOptions() {
		return $this->options;
	}


	/******************************************/
	/* GET SEARCH SEARCH FOR THE CURRENT PAGE */
	/******************************************/
	public function getResults() {
		return $this->results;
	}


	/*****************************/
	/* SEARCH CONTENT FOR IMAGES */
	/*****************************/
	private function searchContentImages() {
		$elxis = eFactory::getElxis();
		$db = eFactory::getDB();
		$eFiles = eFactory::getFiles();
		$lowlev = $elxis->acl()->getLowLevel();
		$exactlev = $elxis->acl()->getExactLevel();

		$lng = '';
		if ($elxis->getConfig('MULTILINGUISM') == 1) { $lng = eFactory::getURI()->getUriLang(); }
		/* the multilingual query is not tested with others than mysql dbs, so better disable 
		multilingual search to avoid SQL errors on other than mysql DBs */
		if ($db->getType() != 'mysql') { $lng = ''; }

		$query_time = '';
		if ($this->options['time'] > 0) {
			if ($this->options['time'] < 365) {
				$tstart = time() - ($this->options['time'] * 24 * 3600);
				$datestart = eFactory::getDate()->formatTS($tstart, '%Y-%m-%d %H:%M:%S', false);
				$query_time = "\n AND a.created >= ".$db->quote($datestart);
			} else if ($this->year > 0) {
				if ($this->month > 0) {
					$query_time = "\n AND a.created LIKE ".$db->quote($this->year.'-'.$this->month.'%');
				} else {
					$query_time = "\n AND a.created LIKE ".$db->quote($this->year.'%');
				}
			}
		}

		if ($this->options['type'] != '') {
			$query_image = "\n AND a.image LIKE '%.".$this->options['type']."'";
		} else {
			$query_image = "\n AND a.image IS NOT NULL";
		}

		$query_title = '';
		if ($this->options['q'] != '') {
			$query_title = "\n AND ((a.title LIKE :qttl) OR (a.caption LIKE :qttl)";
			if ($lng != '') {
				$query_title .= " OR (t.translation LIKE :qttl) OR (x.translation LIKE :qttl)";
			}
			$query_title .= ")";
		}

		if ($this->options['ordering'] == 'ta') {
			$orderby = 'a.title ASC';
		} else if ($this->options['ordering'] == 'td') {
			$orderby = 'a.title DESC';
		} else if ($this->options['ordering'] == 'da') {
			$orderby = 'a.created ASC';
		} else {
			$orderby = 'a.created DESC';
		}

		$sql = "SELECT a.id, a.title, a.caption, a.created, a.image, c.catid, ";
		if ($lng != '') {
			$sql .= 't.translation AS transtitle, x.translation AS transcaption';
		} else {
			$sql .= 'NULL AS transtitle, NULL AS transcaption';
		}
		$sql .= "\n FROM #__content a"
		."\n LEFT JOIN #__categories c ON c.catid=a.catid";
		if ($lng != '') {
			$sql .= "\n LEFT JOIN #__translations t ON t.elid=a.id AND t.category=:trcat AND t.language=:trlang AND t.element=:trelemt";
			$sql .= "\n LEFT JOIN #__translations x ON x.elid=a.id AND x.category=:trcat AND x.language=:trlang AND x.element=:trelemc";
		}
		$sql .= "\n WHERE a.published=1"
		."\n AND ((a.alevel <= :lowlevel) OR (a.alevel = :exactlevel))"
		.$query_time
		.$query_image
		.$query_title
		."\n AND ((c.published=1) OR (a.catid=0))"
		."\n AND ((c.alevel <= :lowlevel) OR (c.alevel = :exactlevel) OR (a.catid=0))"
		."\n ORDER BY ".$orderby;

		$stmt = $db->prepareLimit($sql, 0, 500);
		$stmt->bindParam(':lowlevel', $lowlev, PDO::PARAM_INT);
		$stmt->bindParam(':exactlevel', $exactlev, PDO::PARAM_INT);
		if ($this->options['q'] != '') {
			$qs = '%'.$this->options['q'].'%';
			$stmt->bindParam(':qttl', $qs, PDO::PARAM_STR);
		}
		if ($lng != '') {
			$trcat = 'com_content';
			$trelemt = 'title';
			$trelemc = 'caption';
			$stmt->bindParam(':trcat', $trcat, PDO::PARAM_STR);
			$stmt->bindParam(':trlang', $lng, PDO::PARAM_STR);
			$stmt->bindParam(':trelemt', $trelemt, PDO::PARAM_STR);
			$stmt->bindParam(':trelemc', $trelemc, PDO::PARAM_STR);
		}
		$stmt->execute();
		$articles = $stmt->fetchAll(PDO::FETCH_ASSOC);
		if (!$articles) { return array(); }

		$rows = array();
		$qtlen = 0;
		if ($this->options['q'] != '') {
			$qtlen = eUTF::strlen($this->options['q']);
		}

		foreach ($articles as $article) {
			$relevancy = 0;
			if (!file_exists(ELXIS_PATH.'/'.$article['image'])) { continue; }
			if (trim($article['transcaption']) != '') {
				$title = $article['transcaption'];
			} else if (trim($article['transtitle']) != '') {
				$title = $article['transtitle'];
			} else if (trim($article['caption']) != '') {
				$title = $article['caption'];
			} else {
				$title = $article['title'];
			}

			if ($this->options['q'] != '') {
				$trel = (100 - (eUTF::strlen($title) - $qtlen));
				if ($trel > 0) { $relevancy += $trel; }
			}

			$file_info = $eFiles->getNameExtension($article['image']);
			if (file_exists(ELXIS_PATH.'/'.$file_info['name'].'_thumb.'.$file_info['extension'])) {
				$thumb = $file_info['name'].'_thumb.'.$file_info['extension'];
			} else {
				$thumb = $article['image'];
			}

			$image = $article['image'];
			if ($this->options['size'] != '') {
				$relevancy += 4;
				if (($this->options['size'] == 'xs') || ($this->options['size'] == 's')) {
					if (!file_exists(ELXIS_PATH.'/'.$file_info['name'].'_thumb.'.$file_info['extension'])) {
						continue;
					}
					$image = $file_info['name'].'_thumb.'.$file_info['extension'];
				} else if ($this->options['size'] == 'm') {
					if (!file_exists(ELXIS_PATH.'/'.$file_info['name'].'_medium.'.$file_info['extension'])) {
						continue;
					}
					$image = $file_info['name'].'_medium.'.$file_info['extension'];
				} else if ($this->options['size'] == 'l') {
					$image = $article['image'];
				} else { //xl
					$image = $article['image'];
					if (filesize(ELXIS_PATH.'/'.$image) < 122880) { continue; }
				}
			}

			if ($this->options['time'] != 0) {
				$relevancy += 2;
			}

			$fsize = getimagesize(ELXIS_PATH.'/'.$image);

			$img = new stdClass;
			$img->image = $image;
			$img->thumbnail = $thumb;
			$img->title = $title;
			$img->size = filesize(ELXIS_PATH.'/'.$image);
			$img->type = $file_info['extension'];
			$img->width = $fsize[0];
			$img->height = $fsize[1];
			$img->time = strtotime($article['created']);
			$img->relevancy = $relevancy;
			$rows[] = $img;
		}

		return $rows;
	}


	/*****************************************/
	/* SEARCH FILESYSTEM FOR MATHCING IMAGES */
	/*****************************************/
	private function searchFileImages() {
		if ($this->dosearch === false) { return array(); }
		if (count($this->search_dirs) == 0) { return array(); }

		clearstatcache();

		$irelevancy = 0;
		if ($this->options['type'] != '') {
			$pattype = '*.'.$this->options['type'];
			$irelevancy += 5;
		} else {
			$pattype = '*.jpg,*.gif,*.png,*.bmp,*.jpeg,*.webp';
		}

		$patdirs = implode(',',$this->search_dirs);
		$images = glob("{".$patdirs."}{".$pattype."}", GLOB_BRACE);
		if (!$images) { return array(); }

		if ($this->options['time'] > 0) {
			$tstart = time() - ($this->options['time'] * 24 * 3600);
		} else if ($this->options['time'] == -1 ) {
			$tstart = mktime(0, 0, 0, date('m'), 1, date('Y'));
		} else if ($this->options['time'] == -2 ) {
			$tstart = mktime(0, 0, 0, 1, 1, date('Y'));
		} else {
			$tstart = 0;
		}

		$tstart = 0;
		$tend = 0;
		if ($this->options['time'] > 0) {
			if ($this->options['time'] < 365) {
				$tstart = time() - ($this->options['time'] * 24 * 3600);
				$tend = time();
			} else if ($this->year > 0) {
				if ($this->month > 0) {
					$ts = gmmktime(12, 0, 0, $this->month, 15, $this->year);
					$days = date('t', $ts);
					$tstart = gmmktime(0, 0, 0, $this->month, 1, $this->year);
					$tend = gmmktime(23, 59, 59, $this->month, $days, $this->year);
				} else {
					$tstart = gmmktime(0, 0, 0, 1, 1, $this->year);
					$tend = gmmktime(23, 59, 59, 12, 31, $this->year);
				}
			}
		}

		$rows = array();
		
		$qt = '';
		$qtlen = 0;
		if ($this->options['q'] != '') {
			$qt = eUTF::utf8_to_ascii($this->options['q']);
			$qt = str_replace(' ', '_', $qt);
			$qt = str_replace('-', '_', $qt);
			$qtlen = strlen($qt);
		}

		foreach ($images as $image) {
			$relevancy = $irelevancy;

			$time = filemtime(ELXIS_PATH.'/'.$image);
			if ($tstart > 0) {
				if (($time < $tstart) || ($time > $tend)) { continue; }
				$relevancy += 2;
			}

			$size = filesize(ELXIS_PATH.'/'.$image);
			if ($this->options['size'] != '') {
				$relevancy += 4;
				if ($size < 5120) { //5kb
					$isize = 'xs';
				} else if ($size < 15360) { //15kb
					$isize = 's';
				} else if ($size < 61440) { //60kb
					$isize = 'm';
				} else if ($size < 122880) { //120kb
					$isize = 'l';
				} else {
					$isize = 'xl';
				}

				if ($this->options['size'] != $isize) { continue; }
			}

			$fsize = getimagesize(ELXIS_PATH.'/'.$image);
			$ext = $this->getImageType($fsize[2]);

			$p = strrpos($image, '/') + 1;
			$title = substr($image, $p);
			$title = preg_replace('/(.'.$ext.')$/', '', $title);
			$title = str_replace('-', '_', $title);
			if ($qt != '') {
				if (stripos($title, $qt) === false) { continue; }
				$relevancy += (100 - (strlen($title) - $qtlen));
			}
			$title = str_replace('_', ' ', $title);
			$title = str_replace('.', ' ', $title);

			$img = new stdClass;
			$img->image = $image;
			$img->thumbnail = $image;
			$img->title = $title;
			$img->size = $size;
			$img->type = $ext;
			$img->width = $fsize[0];
			$img->height = $fsize[1];
			$img->time = $time;
			$img->relevancy = $relevancy;
			$rows[] = $img;
		}

		return $rows;
	}


	/************************/
	/* LIMIT SEARCH RESULTS */
	/************************/
	private function limitResults($rows, $page=1) {
		$this->total = count($rows);
		if ($page < 1) { $page = 1; }
		$this->limitstart = 0;
		$maxpage = ($this->total == 0) ? 1 : ceil($this->total/$this->limit);
		if ($maxpage < 1) { $maxpage = 1; }
		if ($page > $maxpage) { $page = $maxpage; }
		$this->limitstart = (($page - 1) * $this->limit);

		$this->page = $page;
		$this->maxpage = $maxpage;
		if ($this->total <= $this->limit) { return $rows; }

		$page_rows = array();
		$end = $this->limitstart + $this->limit;
		foreach ($rows as $key => $row) {
			if ($key < $this->limitstart) { continue; }
			if ($key >= $end) { break; }
			$page_rows[] = $row;
		}
		return $page_rows;
	}


	/***********************/
	/* SHOW SEARCH RESULTS */
	/***********************/
	public function showResults() {
		$elxis = eFactory::getElxis();
		$eDate = eFactory::getDate();
		$eLang = eFactory::getLang();
		$eDoc = eFactory::getDocument();

		$eDoc->addStyleLink($elxis->secureBase().'/components/com_search/engines/images/images.engine.css');
		
		if ($this->dosearch == false) { return; }
		if ($this->total == 0) {
			echo '<div class="elx5_warning">'.$eLang->get('SEARCH_NO_RESULTS')."</div>\n";
			return;
		}

		$eDoc->loadMediabox();

		echo '<div class="elx5_ieng_container">'."\n";
		foreach ($this->results as $row) {
			echo '<div class="elx5_ieng_box">'."\n";
			echo '<div class="elx5_ieng_imgbox">'."\n";
			echo '<a href="'.$elxis->secureBase().'/'.$row->image.'" data-mediabox="resultimage" data-title="'.$row->title.'">';
			echo '<img src="'.$elxis->secureBase().'/'.$row->image.'" alt="'.$row->title.'">';
			echo "</a>\n";
			echo "</div>\n";
			echo '<div class="elx5_ieng_notes">'."\n";
			echo $row->width.'x'.$row->height.' - '.$this->formatFilesize($row->size)."<br>\n";
			echo $eDate->formatTS($row->time, $eLang->get('DATE_FORMAT_4'));
			echo "</div>\n";
			echo "</div>\n";
		}
		echo "</div>\n";
	}


	/*******************/
	/* FORMAT FILESIZE */
	/*******************/
	private function formatFilesize($size) {
		if ($size < 400000) {
			$r = ($size / 1024);
			return number_format($r, 1, '.', '').'kb';
		} else {
			$r = ($size / (1024 * 1024));
			return number_format($r, 2, '.', '').'mb';
		}
	}


	/*********************/
	/* ORDER IMAGE FILES */
	/*********************/
	private function sortResults($a, $b) {
		if ($this->options['ordering'] == 'da') {
			if ($a->time == $b->time) { return 0; }
			return ($a->time < $b->time) ? -1 : 1;
		} else if ($this->options['ordering'] == 'dd') {
			if ($a->time == $b->time) { return 0; }
			return ($a->time < $b->time) ? 1 : -1;
		} else if ($this->options['ordering'] == 'sa') {
			if ($a->size == $b->size) { return 0; }
			return ($a->size < $b->size) ? -1 : 1;
		} else if ($this->options['ordering'] == 'sd') {
			if ($a->size == $b->size) { return 0; }
			return ($a->size < $b->size) ? 1 : -1;
		} else if ($this->options['ordering'] == 'ta') {
			return strcasecmp($a->title, $b->title);
		} else if ($this->options['ordering'] == 'td') {
			return (strcasecmp($a->title, $b->title) * -1);
		} else if ($this->options['ordering'] == 'r') {
			if ($a->relevancy == $b->relevancy) { return 0; }
			return ($a->relevancy < $b->relevancy) ? 1 : -1;
		} else {
			return 0;
		}
	}


	/******************/
	/* GET IMAGE TYPE */
	/******************/
	private function getImageType($type=0) {
		switch($type) {
			case 1: return 'gif'; break;
			case 2: return 'jpg'; break;
			case 3: return 'png'; break;
			case 4: return 'swf'; break;
			case 5: return 'psd'; break;
			case 6: return 'bmp'; break;
			case 7: return 'tiff'; break; //intel
			case 8: return 'tiff'; break; //motorola
			case 9: return 'jpc'; break;
			case 10: return 'jp2'; break;
			case 11: return 'jpx'; break;
			case 12: return 'jb2'; break;
			case 13: return 'swc'; break;
			case 14: return 'iff'; break;
			case 15: return 'wbmp'; break;
			case 16: return 'xbm'; break;
			default: return 'unknown'; break;
		}
	}

}

?>