<?php

/******************************************************************************
 *
 * Purpose: AJAX server part of the statistic plugin for p.mapper 
 * Author:  Thomas Raffin, SIRAP
 *
 ******************************************************************************
 *
 * Copyright (c) 2007 SIRAP
 *
 * This file is part of p.mapper.
 *
 * p.mapper is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version. See the COPYING file.
 *
 * p.mapper is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with p.mapper; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 ******************************************************************************/
// prevent XSS
if (isset($_REQUEST['_SESSION'])) exit();

require_once('../../incphp/group.phtml');

require_once('../../incphp/pmsession.phtml');

if (!isset($_SESSION['queryeditor_activated']) || !$_SESSION['queryeditor_activated']) {
	exit();
}

require_once($_SESSION['PM_INCPHP'] . '/common.phtml');
require_once($_SESSION['PM_INCPHP'] . '/globals.phtml');
require_once($_SESSION['PM_INCPHP'] . '/query/squery.phtml');
require_once($_SESSION['PM_INCPHP'] . '/query/search.phtml');
require_once(dirname(__FILE__) . '/../common/groupsAndLayers.phtml');
require_once(dirname(__FILE__) . '/../common/selectTools.inc.phtml');

require_once(dirname(__FILE__) . '/queryeditor.phtml');

$operation = $_REQUEST['operation'];

header("Content-type: text/plain; charset=$defCharset");

$continue = false;
$layerName = $_REQUEST['layername'];
$groups = queryeditorGetGroups($map);
if (count($groups) >= 0) {
	if (array_key_exists($layerName, $groups)) {
		$continue = true;
	}
}

if ($continue) {
    // Request = ask for fields list
    if ($operation == 'getattributes') {
    	$attributes = getAttributsRealAndReadNames($layerName);
    	$result = array();
    	$numAttributes = min(count($attributes['valuesToUse']), count($attributes['valuesToShow']));
    	for ($iAttribute = 0 ; $iAttribute < $numAttributes ; $iAttribute++) {
    		$attribute = array();
    		$attribute['field'] = addslashes($attributes['valuesToUse'][$iAttribute]);
    		$attribute['header'] = addslashes($attributes['valuesToShow'][$iAttribute]);
    		$result[] = $attribute;
    	}
    	echo "{\"attributes\":" . json_encode($result) . "}";
    
    // Request = execute query 
    } else if ($operation == 'query') {
    
    	$_REQUEST['externalSearchDefinition'] = true;
    	$_REQUEST['mode'] = 'search';
    
    	
    	$mapLayers = getLayersByGroupOrLayerName($map, $layerName);
    
    	if ($mapLayers && $mapLayers[0]) {
    		$queryResult = '';
    		// Query received from the editor without modification:
    		$originalQuery = $_REQUEST['query'];
    		
    		foreach($mapLayers as $mapLayer) {
    			$_REQUEST['layerName'] = $mapLayer->name;
        		$layerType = $mapLayer->connectiontype;
        		// Query to execute:
        		$modifiedQuery = '';
        		// Query with the real fields names instead of headers:
        		$modifiedQueryWithRealNames = $originalQuery;
        		$attributes = getAttributsRealAndReadNames($layerName);
        		foreach ($attributes['valuesToUse'] as $indice => $valueToUse) {
        			$valueToShow = $attributes['valuesToShow'][$indice];
        			$modifiedQueryWithRealNames = str_replace("[$valueToShow]", "[$valueToUse]", $modifiedQueryWithRealNames);
        		}
        		// First field :
        		if (preg_match("/\[([^\]]*)\]/", $modifiedQueryWithRealNames, $attributes)) {
        			$firstFld = $attributes[1];
        		} else {
        			$firstFld = '';
        		}
        		// end of lines :
        		$modifiedQueryWithoutEOL = str_replace("\n", ' ', $modifiedQueryWithRealNames);
        		// backslashes before quotes: 
                if (get_magic_quotes_gpc()) {
        			$modifiedQueryWithoutEOL = stripslashes($modifiedQueryWithoutEOL);
        		}
            
        		// SHP :
        		if ($layerType == 1) {
        			$_REQUEST['layerType'] = 'shape';
        			$_REQUEST['firstFld'] = $firstFld;
        			// strings and numbers:
        			$modifiedQueryTmp = preg_replace("/([^\[]*)\[([^\]]*)\]\s*([^\s]*)\s*'([^']*[^\\\])'/", "$1 \"[$2]\" $3 /'$4'/", $modifiedQueryWithoutEOL);
	      			$modifiedQueryTmp = str_replace(" LIKE ", " = ", $modifiedQueryTmp);
      	 			$modifiedQueryTmp = str_replace(" ILIKE ", " =~ ", $modifiedQueryTmp);
//        			$modifiedQueryTmp = str_replace(" LIKE ", " =~ ", $modifiedQueryTmp);
        			$modifiedQueryTmp = str_replace("/'%", "/", $modifiedQueryTmp);
        			$modifiedQueryTmp = str_replace("%'/", "/", $modifiedQueryTmp);
        			$modifiedQueryTmp = str_replace("/'", "/^", $modifiedQueryTmp);
        			$modifiedQueryTmp = str_replace("'/", "$/", $modifiedQueryTmp);
//	          		$modifiedQueryTmp = str_replace("%", ".*", $modifiedQueryTmp);
        			if ($modifiedQueryTmp) {
        				$modifiedQuery = "(($modifiedQueryTmp))";
        			}
        		// PostGIS :
        		} else if ($layerType == 6) {
        			$_REQUEST['layerType'] = 'postgis';
        			$_REQUEST['firstFld'] = $firstFld;
        			// strings only:
//        			$modifiedQueryTmp = preg_replace("/([^\[]*)\[([^\]]*)\]\s*([^\s]*)\s*'(.*[^\\\])'/", "$1 $2 $3 /'$4'/", $modifiedQueryWithoutEOL);
        			$modifiedQueryTmp = preg_replace("/([^\[]*)\[([^\]]*)\]\s*([^\s]*)\s*'([^']*[^\\\])'/", "$1 $2 $3 /'$4'/", $modifiedQueryWithoutEOL);
        			// numbers only:
        			$modifiedQueryTmp = preg_replace("/\[([^\]]*)\]/", "$1", $modifiedQueryTmp);
        			$modifiedQueryTmp = str_replace(" LIKE ", " ~ ", $modifiedQueryTmp);
	          		$modifiedQueryTmp = str_replace(" ILIKE ", " ~* ", $modifiedQueryTmp);
//        			$modifiedQueryTmp = str_replace(" LIKE ", " ~* ", $modifiedQueryTmp);
        			$modifiedQueryTmp = str_replace("/'%", "'", $modifiedQueryTmp);
        			$modifiedQueryTmp = str_replace("%'/", "'", $modifiedQueryTmp);
        			$modifiedQueryTmp = str_replace("/'", "'^", $modifiedQueryTmp);
        			$modifiedQueryTmp = str_replace("'/", "$'", $modifiedQueryTmp);
//        			$modifiedQueryTmp = str_replace("%", ".*", $modifiedQueryTmp);
        			if ($modifiedQueryTmp) {
        				$modifiedQuery = $modifiedQueryTmp;
        			}

					// filter:
        			$mapLayerFilter = $mapLayer->getFilterString();
        			if ($mapLayerFilter) {
        				$modifiedQuery = "($mapLayerFilter) AND ($modifiedQuery)";
        			}
        		}
        		
        		// Execute query :
        		if ($modifiedQuery) {
					$_REQUEST["qStr"] = $modifiedQuery;
        			$mapQuery = new Query($map);
        			$mapQuery->q_processQuery();
					$resTmp = $mapQuery->q_returnQueryResult();
					if ($resTmp) {
						if ($queryResult) {
							$queryResult = SelectTools::add($queryResult, $resTmp);
						} else {
							$queryResult = $resTmp;
						}
					}
        			//$numResultsTotal = $mapQuery->q_returnNumResultsTotal();
        		}
    		}
    		if (!$queryResult) {
    			$queryResult = 0;	
    		} else {
    			// update selection
    			$_SESSION['JSON_Results'] = $queryResult;
    			// highlight results
    			SelectTools::updateHighlightJson($queryResult);
    		}
    		echo "{\"mode\":\"$mode\", \"queryResult\":$queryResult}";
	   } else {
	       die(_p('No results!'));
        }
    } else {
        die(_p('Query editor plugin not activated'));
    }
} else {
	die(_p('Query editor plugin not activated'));
	exit();
}

//exit();
?>