Seditio Source
Root |
./othercms/elxis_5.3_atlas_rev2452/components/com_search/engines/images/images.engine.php
<?php
/**
* @version        $Id: images.engine.php 2202 2019-04-10 17:41:17Z IOS $
* @package        Elxis
* @subpackage    Component Search
* @copyright    Copyright (c) 2006-2019 Elxis CMS (http://www.elxis.org). All rights reserved.
* @license        Elxis Public License ( http://www.elxis.org/elxis-public-license.html )
* @author        Elxis Team ( http://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() {
       
$pat = "#([\']|[\;]|[\.]|[\"]|[\$]|[\/]|[\#]|[\<]|[\>]|[\*]|[\~]|[\`]|[\^]|[\|]|[\\\])#u";
       
$pat = "#([\']|[\;]|[\.]|[\"]|[\$]|[\/]|[\|]|[\=]|[\#]|[\<]|[\>]|[\*]|[\~]|[\`]|[\^]|[\|]|[\\\])#u";
        if (isset(
$_GET['q'])) {
           
$q = urldecode(filter_input(INPUT_GET, 'q', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW));
           
$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(filter_input(INPUT_GET, 'size', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
            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(filter_input(INPUT_GET, 'type', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
            if (
in_array($type, array('jpg', 'png', 'gif', 'bmp', 'svg'))) {
               
$this->options['type'] = $type;
               
$this->dosearch = true;
            }
        }

        if (isset(
$_GET['ordering'])) {
           
$ordering = trim(filter_input(INPUT_GET, 'ordering', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
            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';
        }

       
$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;
        }
    }

}

?>