/**
  * Returns an XML document
  * @param    int        $quid: question UID
  * @return    string    xml-document
  */
 function getAjaxDetails($quid)
 {
     $quid = intval($quid);
     $nr = 0;
     $sOut = '';
     //$template = str_replace('\"', '', $template);
     $template = $this->cObj->getSubpart($this->templateCode, "###TEMPLATE_DETAILS_ITEM###");
     //$template_item = preg_replace('/\r?\n/', " ", $template_item);
     //$template_item = str_replace("'", '"', $template_item);
     $template = str_replace('###PREFIX###', $this->prefixId, $template);
     $result = $GLOBALS['TYPO3_DB']->exec_SELECTquery('COUNT(*) anzahl', 'tx_myquizpoll_relation', 'LENGTH(textinput)>0 AND question_id=' . $quid, '', '', '');
     $rowA = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($result);
     $gesamt = $rowA['anzahl'];
     $GLOBALS['TYPO3_DB']->sql_free_result($result);
     if ($gesamt > 0) {
         $result = $GLOBALS['TYPO3_DB']->exec_SELECTquery('DISTINCT textinput texte, COUNT( textinput ) anzahl', 'tx_myquizpoll_relation', 'LENGTH(textinput)>0 AND question_id=' . $quid, 'textinput', '', '');
         $rows = $GLOBALS['TYPO3_DB']->sql_num_rows($result);
         if ($rows > 0) {
             while ($rowA = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($result)) {
                 if ($nr % 2 == 0) {
                     $even_odd = 'even';
                 } else {
                     $even_odd = 'odd';
                 }
                 $prozent = number_format(100 * $rowA['anzahl'] / $gesamt, 2, ',', ' ');
                 //$texte = preg_replace("/(\r\n)+|(\n|\r)+/", "<br />", $rowA['texte']);    // nl2br funktioniert auch nicht
                 $texte = str_replace('\\r\\n', '<br />', htmlspecialchars($rowA['texte']));
                 $temp = str_replace('###ITEM_EVEN_ODD###', $even_odd, $template);
                 $temp = str_replace('###ITEM_ANSWER###', $texte, $temp);
                 $temp = str_replace('###ITEM_PERCENT###', $prozent, $temp);
                 $temp = str_replace('###ITEM_COUNTS###', $rowA['anzahl'], $temp);
                 $sOut .= $temp;
                 $nr++;
             }
         }
     }
     /* instantiate the xajaxResponse object */
     $objResponse = new tx_xajax_response();
     $objResponse->addScript("document.getElementById('details_hidden-{$quid}').style.display='block'; document.getElementById('show_details-{$quid}').style.display='none';");
     /* We alter the contents of the HTML element. The property 'innerHTML' is the html code inside this element. We replace it with the result in our $sOut variable */
     $objResponse->addAssign("details-{$quid}", "innerHTML", $sOut);
     /* With the getXML() method on the xajaxResponse objectwe send everything back to the client */
     return $objResponse->getXML();
 }
    /**
     * Function for the ajax search
     *
     * @param	string		$searchFields: The search fiels (search word & search on map only)
     * @return	Records found with search value
     */
    function search($searchForm)
    {
        $template['list'] = $this->cObj->getSubpart($this->templateCode, '###TEMPLATE_SEARCH_RESULTS###');
        $template["item"] = $this->cObj->getSubpart($template["list"], "###SINGLE###");
        $objResponse = new tx_xajax_response($GLOBALS['TSFE']->metaCharset);
        $test = "";
        // minimum characters needed, default = 3
        if (strlen($searchForm['rggmsearchValue']) >= $this->conf['search.']['minChars'] || $searchForm['rggmActivateRadius'] == "on" && $searchForm['rggmRadius'] > 0) {
            $res = array();
            // search for a text
            // escaping the search-value
            $delete = array("'", "\"", "\\", "/", "");
            $searchExpression = $searchForm['rggmsearchValue'];
            $searchExpression = str_replace($delete, "", $searchExpression);
            $tablelist = explode(',', $this->config['tables']);
            foreach ($tablelist as $key => $table) {
                $where = 'deleted = 0 AND pid IN (' . $this->config['pid_list'] . ')  ';
                if ($this->conf['search.'][$table]) {
                    $select = '*';
                    $searchField = explode(',', $this->conf['search.'][$table]);
                    $where2 = '';
                    foreach ($searchField as $key => $value) {
                        $where2 .= " {$value} LIKE '%{$searchExpression}%' OR";
                    }
                    $where .= ' AND ( ' . substr($where2, 0, -3) . ' ) ';
                    // search only within the map area
                    if ($searchForm['rggmOnMap'] == 'on') {
                        $areaArr = preg_split('/%2C%20/', $searchForm['rggmBound']);
                        $where .= 'AND lng between ' . $areaArr[1] . ' AND ' . $areaArr[3] . '
                          AND	lat between ' . $areaArr[0] . ' AND ' . $areaArr[2];
                    }
                    // radius search (umkreissuche)
                    if ($searchForm['rggmActivateRadius'] == "on") {
                        $coordinates = $this->geoCodeAddress("", $searchForm['rggmZip']);
                        if ($coordinates != "") {
                            $coordinates = explode(',', $coordinates);
                            $select = '*,SQRT(POW(' . $coordinates[1] . '-lng,2)*6400 + POW(' . $coordinates[0] . '-lat,2)*12100) AS distance';
                            $where .= ' AND SQRT(POW(' . $coordinates[1] . '-lng,2)*6400 + POW(' . $coordinates[0] . '-lat,2)*12100) <' . intval($searchForm['rggmRadius']);
                            $orderBy = 'distance';
                            $offset = '0,' . $this->conf['recordsPerPage'];
                            $offset = '0,10';
                            $test = "\n                marker = createMarker(new GLatLng({$coordinates['0']},{$coordinates['1']}), 99999, 'dot.png', 'Standort (" . $searchForm['rggmZip'] . ")', 'fe_users'); map.addOverlay( marker );\n                bounds.extend(new GLatLng({$coordinates['0']},{$coordinates['1']}));\n                 ";
                        }
                    }
                    $res = $this->generic->exec_SELECTquery($select, $table, $where, $groupBy, $orderBy, '0,' . $this->conf['recordsPerPage']);
                    #$content.=t3lib_div::view_array($res);
                }
            }
            #$res = $this->generic->exec_SELECTquery('*',$table,$where,$groupBy,$orderBy,'0,'.$this->conf['recordsPerPage'],1);
            $i = 0;
            $jsResultDelete = 'deleteSearchResult();';
            $jsResultUpdate = 'var bounds = new GLatLngBounds();';
            while ($row = array_shift($res)) {
                $tmp = $this->getMarker($row, 'search.');
                $markerArray = $tmp['markerArray'];
                $wrappedSubpartArray = $tmp['wrappedSubpartArray'];
                $i++;
                $markerArray['###SEARCHID###'] = $i;
                $title = '"marker' . $i . '.png"';
                $jsResultUpdate .= "\n          marker = createMarker(new GLatLng({$row['lat']},{$row['lng']}), {$row['uid']}, {$title}, '{$row['name']}', '{$row['table']}');\n          map.addOverlay( marker );\n          tempmarkers[{$row['uid']}] = marker;\n          bounds.extend(new GLatLng({$row['lat']},{$row['lng']}));\n        ";
                $content_item .= $this->cObj->substituteMarkerArrayCached($template["item"], $markerArray, array(), $wrappedSubpartArray);
            }
            $jsResultUpdate .= $test;
            $markerArray['###SEARCHEXPRESSION###'] = $searchForm['rggmsearchValue'];
            $markerArray['###SEARCHCOUNT###'] = $i;
            $subpartArray["###CONTENT###"] = $content_item;
            $jsResultUpdate .= '
        var zoom=map.getBoundsZoomLevel(bounds);

        var centerLat = (bounds.getNorthEast().lat() + bounds.getSouthWest().lat()) /2;
        var centerLng = (bounds.getNorthEast().lng() + bounds.getSouthWest().lng()) /2;
        map.setCenter(new GLatLng(centerLat,centerLng),zoom);
      ';
            // Nothing found
            if ($i == 0) {
                $subpartArray["###CONTENT###"] = $this->pi_getLL('searchNoResult');
                $jsResultUpdate = '';
            }
            $content .= $this->cObj->substituteMarkerArrayCached($template['list'], $markerArray, $subpartArray, $wrappedSubpartArray);
            $objResponse->addScript($jsResultDelete);
            $objResponse->addAssign('searchFormResult', 'innerHTML', $content);
            $objResponse->addScript($jsResultUpdate);
            $objResponse->addAssign('searchFormError', 'innerHTML', '');
            // minimum character length not reached
        } else {
            $content .= sprintf($this->pi_getLL('searchMinChars'), $this->conf['search.']['minChars']);
            $objResponse->addAssign('searchFormError', 'innerHTML', $content);
        }
        //	$objResponse->addScript('fdTableSort.init()');
        return $objResponse->getXML();
    }