diff --git a/interface/lib/lang/de.lng b/interface/lib/lang/de.lng index dfaad28e81beab53348bade4fedcfaa73fd0c23f..1bd016c660badeb5bd225dd8edcd9ea09f8b96cd 100644 --- a/interface/lib/lang/de.lng +++ b/interface/lib/lang/de.lng @@ -75,4 +75,5 @@ $wb['globalsearch_resultslimit_results_txt'] = "Treffern"; $wb['globalsearch_noresults_text_txt'] = "Keine Treffer."; $wb['globalsearch_noresults_limit_txt'] = "0 Treffer"; $wb['globalsearch_searchfield_watermark_txt'] = "Suche"; +$wb['globalsearch_suggestions_text_txt'] = "Vorschläge"; ?> diff --git a/interface/lib/lang/en.lng b/interface/lib/lang/en.lng index 4673a707c6a723a19ce9a99aec85adcdeda48fb6..853b46762bb2bf081bf889126cbd03808f7c245f 100644 --- a/interface/lib/lang/en.lng +++ b/interface/lib/lang/en.lng @@ -76,4 +76,5 @@ $wb['globalsearch_resultslimit_results_txt'] = "results"; $wb['globalsearch_noresults_text_txt'] = "No results."; $wb['globalsearch_noresults_limit_txt'] = "0 results"; $wb['globalsearch_searchfield_watermark_txt'] = "Search"; +$wb['globalsearch_suggestions_text_txt'] = "Suggestions"; ?> diff --git a/interface/web/admin/form/server_ip.tform.php b/interface/web/admin/form/server_ip.tform.php index 1bc21d515c8c1748849ab7e92f9ed3edc430d176..b47417cfc5584242e9e4508e53c11651de9b48cc 100644 --- a/interface/web/admin/form/server_ip.tform.php +++ b/interface/web/admin/form/server_ip.tform.php @@ -55,6 +55,11 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Hinweis: Das ID-Feld ist nicht bei den Table Values einzufügen. + + Search: + - searchable = 1 or searchable = 2 include the field in the search + - searchable = 1: this field will be the title of the search result + - searchable = 2: this field will be included in the description of the search result */ @@ -110,7 +115,8 @@ $form["tabs"]['server_ip'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'SELECT', 'default' => '', - 'value' => array('IPv4' => 'IPv4', 'IPv6' => 'IPv6') + 'value' => array('IPv4' => 'IPv4', 'IPv6' => 'IPv6'), + 'searchable' => 2 ), 'ip_address' => array ( 'datatype' => 'VARCHAR', @@ -126,7 +132,8 @@ $form["tabs"]['server_ip'] = array ( 'width' => '15', 'maxlength' => '15', 'rows' => '', - 'cols' => '' + 'cols' => '', + 'searchable' => 1 ), 'virtualhost' => array ( 'datatype' => 'VARCHAR', diff --git a/interface/web/dns/ajax_get_json.php b/interface/web/dns/ajax_get_json.php new file mode 100644 index 0000000000000000000000000000000000000000..410bc77f0a737f41d1cc86a7f5df3ded479d3123 --- /dev/null +++ b/interface/web/dns/ajax_get_json.php @@ -0,0 +1,154 @@ +<?php + +/* +Copyright (c) 2012, ISPConfig UG +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +require_once('../../lib/config.inc.php'); +require_once('../../lib/app.inc.php'); + +//* Check permissions for module +$app->auth->check_module_permissions('dns'); + +$app->uses('tform'); + +$type = $_GET["type"]; + +//if($_SESSION["s"]["user"]["typ"] == 'admin') { + + + if($type == 'get_ipv4'){ + $q = $app->db->quote(trim($_GET["q"])); + $authsql = " AND ".$app->tform->getAuthSQL('r'); + $modules = explode(',', $_SESSION['s']['user']['modules']); + + $result = array(); + + // ipv4 + $result[] = _search('admin', 'server_ip', "AND ip_type = 'IPv4' AND (client_id = 0 OR client_id=".intval($_SESSION['s']['user']['client_id']).")"); + + $json = $app->functions->json_encode($result); + } + + if($type == 'get_ipv6'){ + $q = $app->db->quote(trim($_GET["q"])); + $authsql = " AND ".$app->tform->getAuthSQL('r'); + $modules = explode(',', $_SESSION['s']['user']['modules']); + + $result = array(); + + // ipv4 + $result[] = _search('admin', 'server_ip', "AND ip_type = 'IPv6' AND (client_id = 0 OR client_id=".intval($_SESSION['s']['user']['client_id']).")"); + + $json = $app->functions->json_encode($result); + } + +//} + +function _search($module, $section, $additional_sql = ''){ + global $app, $q, $authsql, $modules; + + $result_array = array('cheader' => array(), 'cdata' => array()); + if(in_array($module, $modules) || ($module == 'admin' && $section == 'server_ip')){ + $search_fields = array(); + $desc_fields = array(); + if(is_file('../'.$module.'/form/'.$section.'.tform.php')){ + include_once('../'.$module.'/form/'.$section.'.tform.php'); + + $category_title = $form["title"]; + $form_file = $form["action"]; + $db_table = $form["db_table"]; + $db_table_idx = $form["db_table_idx"]; + $order_by = $db_table_idx; + + if(is_array($form["tabs"]) && !empty($form["tabs"])){ + foreach($form["tabs"] as $tab){ + if(is_array($tab['fields']) && !empty($tab['fields'])){ + foreach($tab['fields'] as $key => $val){ + if(isset($val['searchable']) && $val['searchable'] > 0){ + $search_fields[] = $key." LIKE '%".$q."%'"; + if($val['searchable'] == 1){ + $order_by = $key; + $title_key = $key; + } + if($val['searchable'] == 2){ + $desc_fields[] = $key; + } + } + } + } + } + } + } + unset($form); + + $where_clause = ''; + if(!empty($search_fields)){ + $where_clause = implode(' OR ', $search_fields); + } else { + // valid SQL query which returns an empty result set + $where_clause = '1 = 0'; + } + if($where_clause != '') $where_clause = '('.$where_clause.')'; + if($additional_sql != '') $where_clause .= ' '.$additional_sql.' '; + $order_clause = ''; + if($order_by != '') $order_clause = ' ORDER BY '.$order_by; + + $sql = "SELECT * FROM ".$db_table." WHERE ".$where_clause.$authsql.$order_clause." LIMIT 0,10"; + $results = $app->db->queryAllRecords($sql); + + if(is_array($results) && !empty($results)){ + $lng_file = '../'.$module.'/lib/lang/'.$_SESSION['s']['language'].'_'.$section.'.lng'; + if(is_file($lng_file)) include($lng_file); + $result_array['cheader'] = array('title' => $category_title, + 'total' => count($results), + 'limit' => count($results) + ); + foreach($results as $result){ + $description = ''; + if(!empty($desc_fields)){ + $desc_items = array(); + foreach($desc_fields as $desc_field){ + if($result[$desc_field] != '') $desc_items[] = $wb[$desc_field.'_txt'].': '.$result[$desc_field]; + } + if(!empty($desc_items)) $description = implode(' - ', $desc_items); + } + + $result_array['cdata'][] = array( 'title' => $wb[$title_key.'_txt'].': '.$result[$title_key], + 'description' => $description, + 'onclick' => '', + 'fill_text' => $result[$title_key] + ); + } + } + } + return $result_array; +} + +header('Content-type: application/json'); +echo $json; +?> \ No newline at end of file diff --git a/interface/web/dns/lib/lang/de_dns_wizard.lng b/interface/web/dns/lib/lang/de_dns_wizard.lng index 1f5202792e34e94355a894c887675dabb3ce33d7..3afbf3ce3a1236a635424c6e20f011365cc1f65f 100644 --- a/interface/web/dns/lib/lang/de_dns_wizard.lng +++ b/interface/web/dns/lib/lang/de_dns_wizard.lng @@ -26,4 +26,10 @@ $wb['error_domain_regex'] = 'Domain beinhaltet ungültige Zeichen.'; $wb['error_ns1_regex'] = 'NS1 beinhaltet ungültige Zeichen.'; $wb['error_ns2_regex'] = 'NS2 beinhaltet ungültige Zeichen.'; $wb['error_email_regex'] = 'E-Mail-Adresse beinhaltet keine gültige Adresse.'; +$wb['globalsearch_resultslimit_of_txt'] = "von"; +$wb['globalsearch_resultslimit_results_txt'] = "Treffern"; +$wb['globalsearch_noresults_text_txt'] = "Keine Treffer."; +$wb['globalsearch_noresults_limit_txt'] = "0 Treffer"; +$wb['globalsearch_searchfield_watermark_txt'] = "Suche"; +$wb['globalsearch_suggestions_text_txt'] = "Vorschläge"; ?> diff --git a/interface/web/dns/lib/lang/en_dns_wizard.lng b/interface/web/dns/lib/lang/en_dns_wizard.lng index 2f9f91421f1ff171ad0050f41f9427e5305ec305..c00be7c5781fa7b9dab152efb086b820c2989389 100644 --- a/interface/web/dns/lib/lang/en_dns_wizard.lng +++ b/interface/web/dns/lib/lang/en_dns_wizard.lng @@ -27,4 +27,10 @@ $wb['error_domain_regex'] = 'Domain contains invalid characters.'; $wb['error_ns1_regex'] = 'NS1 contains invalid characters.'; $wb['error_ns2_regex'] = 'NS2 contains invalid characters.'; $wb['error_email_regex'] = 'Email does not contain a valid email address.'; +$wb['globalsearch_resultslimit_of_txt'] = "of"; +$wb['globalsearch_resultslimit_results_txt'] = "results"; +$wb['globalsearch_noresults_text_txt'] = "No results."; +$wb['globalsearch_noresults_limit_txt'] = "0 results"; +$wb['globalsearch_searchfield_watermark_txt'] = "Search"; +$wb['globalsearch_suggestions_text_txt'] = "Suggestions"; ?> \ No newline at end of file diff --git a/interface/web/dns/templates/dns_a_edit.htm b/interface/web/dns/templates/dns_a_edit.htm index 6a5577cc201ca63f3894d1efe1cdcc22d3603287..fbda5c4337f06959eadc2367ccd6b91b178adfc0 100644 --- a/interface/web/dns/templates/dns_a_edit.htm +++ b/interface/web/dns/templates/dns_a_edit.htm @@ -37,3 +37,18 @@ </div> </div> +<script language="JavaScript" type="text/javascript"> + jQuery('#data').ispconfigSearch({ + dataSrc: '/dns/ajax_get_json.php?type=get_ipv4', + resultsLimit: '$ <tmpl_var name="globalsearch_resultslimit_of_txt"> % <tmpl_var name="globalsearch_resultslimit_results_txt">', + ResultsTextPrefix: '<tmpl_var name="globalsearch_suggestions_text_txt">', + noResultsText: '<tmpl_var name="globalsearch_noresults_text_txt">', + noResultsLimit: '<tmpl_var name="globalsearch_noresults_limit_txt">', + minChars: 0, + cssPrefix: 'df-', + fillSearchField: true, + fillSearchFieldWith: 'fill_text', + searchFieldWatermark: '', + resultBoxPosition: 'e' + }); +</script> \ No newline at end of file diff --git a/interface/web/dns/templates/dns_aaaa_edit.htm b/interface/web/dns/templates/dns_aaaa_edit.htm index 17ec36ff67de8e04e76dd9cf063e0f6d3f857bd0..2db2c5fc0344a487483f35594271e498c94c9f3e 100644 --- a/interface/web/dns/templates/dns_aaaa_edit.htm +++ b/interface/web/dns/templates/dns_aaaa_edit.htm @@ -37,3 +37,18 @@ </div> </div> +<script language="JavaScript" type="text/javascript"> + jQuery('#data').ispconfigSearch({ + dataSrc: '/dns/ajax_get_json.php?type=get_ipv6', + resultsLimit: '$ <tmpl_var name="globalsearch_resultslimit_of_txt"> % <tmpl_var name="globalsearch_resultslimit_results_txt">', + ResultsTextPrefix: '<tmpl_var name="globalsearch_suggestions_text_txt">', + noResultsText: '<tmpl_var name="globalsearch_noresults_text_txt">', + noResultsLimit: '<tmpl_var name="globalsearch_noresults_limit_txt">', + minChars: 0, + cssPrefix: 'df-', + fillSearchField: true, + fillSearchFieldWith: 'fill_text', + searchFieldWatermark: '', + resultBoxPosition: 'e' + }); +</script> diff --git a/interface/web/dns/templates/dns_wizard.htm b/interface/web/dns/templates/dns_wizard.htm index b353094dea3fb78e657dbfab23ad66a76dcbd5e0..49183c18e6d6526d949a049663fcc5a391c63315 100644 --- a/interface/web/dns/templates/dns_wizard.htm +++ b/interface/web/dns/templates/dns_wizard.htm @@ -78,3 +78,18 @@ </div> </div> +<script language="JavaScript" type="text/javascript"> + jQuery('#ip').ispconfigSearch({ + dataSrc: '/dns/ajax_get_json.php?type=get_ipv4', + resultsLimit: '$ <tmpl_var name="globalsearch_resultslimit_of_txt"> % <tmpl_var name="globalsearch_resultslimit_results_txt">', + ResultsTextPrefix: '<tmpl_var name="globalsearch_suggestions_text_txt">', + noResultsText: '<tmpl_var name="globalsearch_noresults_text_txt">', + noResultsLimit: '<tmpl_var name="globalsearch_noresults_limit_txt">', + minChars: 0, + cssPrefix: 'df-', + fillSearchField: true, + fillSearchFieldWith: 'fill_text', + searchFieldWatermark: '', + resultBoxPosition: 'e' + }); +</script> diff --git a/interface/web/js/jquery.ispconfigsearch.js b/interface/web/js/jquery.ispconfigsearch.js index 5ef54d19acf597eeb7b57dbe31642e88e76bca58..fbd594ddc3deec3970125479d7f3dede809cb645 100644 --- a/interface/web/js/jquery.ispconfigsearch.js +++ b/interface/web/js/jquery.ispconfigsearch.js @@ -33,9 +33,11 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. timeout: 500, minChars: 2, resultBox: '-resultbox', + resultBoxPosition: 's', // n = north, e = east, s = south, w = west cssPrefix: 'gs-', fillSearchField: false, fillSearchFieldWith: 'title', + ResultsTextPrefix: '', resultsLimit: '$ of % results', noResultsText: 'No results.', noResultsLimit: '0 results', @@ -50,7 +52,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. settings.resultBox = $(this).attr('id')+settings.resultBox; $(this).attr('autocomplete', 'off'); - $(this).val(settings.searchFieldWatermark); + if($(this).val() == '') $(this).val(settings.searchFieldWatermark); $(this).wrap('<div class="'+settings.cssPrefix+'container" />'); $(this).after('<ul id="'+settings.resultBox+'" class="'+settings.cssPrefix+'resultbox" style="display:none;"></ul>'); var searchField = $(this); @@ -63,7 +65,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // query value var q = searchField.val(); - if (settings.minChars > q.length || q == ''){ + if (settings.minChars > q.length || (q == '' && settings.minChars > 0)){ resultBox.fadeOut(); resetTimer(timeout); } else { @@ -94,7 +96,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } if (!resultsFound){ - output += '<li class="'+settings.cssPrefix+'cheader"><p class="'+settings.cssPrefix+'cheader-title">'+settings.noResultsText+'</p><p class="'+settings.cssPrefix+'cheader-limit">'+settings.noResultsLimit+'</p></li>'; + output += '<li class="'+settings.cssPrefix+'cheader"><p class="'+settings.cssPrefix+'cheader-title">'+(settings.ResultsTextPrefix == '' ? '' : settings.ResultsTextPrefix+': ')+settings.noResultsText+'</p><p class="'+settings.cssPrefix+'cheader-limit">'+settings.noResultsLimit+'</p></li>'; } else { $.each(data, function(i, category){ @@ -103,7 +105,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. var limit = category['cheader']['limit']; var cnt = 0; - output += '<li class="'+settings.cssPrefix+'cheader"><p class="'+settings.cssPrefix+'cheader-title">'+category['cheader']['title']+'</p><p class="'+settings.cssPrefix+'cheader-limit">'+settings.resultsLimit.replace("%", category['cheader']['total']).replace("$", (category['cheader']['limit'] < category['cdata'].length ? category['cheader']['limit'] : category['cdata'].length))+'</p></li>'; + output += '<li class="'+settings.cssPrefix+'cheader"><p class="'+settings.cssPrefix+'cheader-title">'+(settings.ResultsTextPrefix == '' ? '' : settings.ResultsTextPrefix+': ')+category['cheader']['title']+'</p><p class="'+settings.cssPrefix+'cheader-limit">'+settings.resultsLimit.replace("%", category['cheader']['total']).replace("$", (category['cheader']['limit'] < category['cdata'].length ? category['cheader']['limit'] : category['cdata'].length))+'</p></li>'; var fillSearchFieldCode = (settings.fillSearchField) ? 'document.getElementById(\''+searchField.attr('id')+'\').value = \'%\';' : ''; //var fillSearchFieldCode = 'document.getElementById(\''+searchField.attr('id')+'\').value = \'%\';'; @@ -128,7 +130,19 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. }); } - resultBox.html(output).css({'position' : 'absolute', 'top' : searchField.position().top+searchField.outerHeight(), 'right' : '0'}).fadeIn(); + //resultBox.html(output).css({'position' : 'absolute', 'top' : searchField.position().top+searchField.outerHeight(), 'right' : '0'}).fadeIn(); + if(settings.resultBoxPosition == 'n'){ + resultBox.html(output).css({'position' : 'absolute', 'top' : searchField.position().top-resultBox.outerHeight(), 'left' : searchField.position().left+searchField.outerWidth()-resultBox.outerWidth()}).fadeIn(); + } + if(settings.resultBoxPosition == 'e'){ + resultBox.html(output).css({'position' : 'absolute', 'top' : searchField.position().top, 'left' : searchField.position().left+searchField.outerWidth()}).fadeIn(); + } + if(settings.resultBoxPosition == 's'){ + resultBox.html(output).css({'position' : 'absolute', 'top' : searchField.position().top+searchField.outerHeight(), 'left' : searchField.position().left+searchField.outerWidth()-resultBox.outerWidth()}).fadeIn(); + } + if(settings.resultBoxPosition == 'w'){ + resultBox.html(output).css({'position' : 'absolute', 'top' : searchField.position().top, 'left' : searchField.position().left-resultBox.outerWidth()}).fadeIn(); + } searchField.removeClass(settings.cssPrefix+'loading'); } @@ -150,6 +164,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. resultBox.fadeIn(); } else if(searchField.val() == settings.searchFieldWatermark){ searchField.val(''); + if(settings.minChars == 0) searchField.trigger('keyup'); } else if (searchField.val() != ''){ searchField.trigger('keyup'); } diff --git a/interface/web/themes/default/css/screen/content_ispc.css b/interface/web/themes/default/css/screen/content_ispc.css index 3b74355992432ee674eefcee0879c8f8683d3c2e..b3d9354861d65ebed0919d43fb4e4988ecdb2e29 100644 --- a/interface/web/themes/default/css/screen/content_ispc.css +++ b/interface/web/themes/default/css/screen/content_ispc.css @@ -1126,5 +1126,128 @@ -ms-border-radius:0 0 5px 5px; border-radius:0 0 5px 5px; } + + div.df-container{ + } + div.df-container *{ + margin: 0; + padding: 0; + background-position: 0 0; + text-decoration: none; + font-size: 1em; + } + div.df-container input{ + } + input.df-loading{ + background-image: url(../../icons/x16/loading.gif); + background-repeat: no-repeat; + background-position: center right; + } + ul.df-resultbox{ + margin: 0 !important; + padding: 0 !important; + min-width: 250px; + max-width: 500px; + z-index: 999999; + border: 1px solid #777; + font-size: 11px; + background: #fff; + -moz-box-shadow: 2px 2px 5px 0 #c5c5c5; + -webkit-box-shadow: 2px 2px 5px 0 #c5c5c5; + -khtml-box-shadow: 2px 2px 5px 0 #c5c5c5; + -o-box-shadow: 2px 2px 5px 0 #c5c5c5; + -ms-box-shadow: 2px 2px 5px 0 #c5c5c5; + box-shadow: 2px 2px 5px 0 #c5c5c5; + list-style: none; + -moz-border-radius:5px; + -webkit-border-radius:5px; + -khtml-border-radius:5px; + -o-border-radius:5px; + -ms-border-radius:5px; + border-radius:5px; + } + ul.df-resultbox li{ + float: left; + width: 100%; + clear: both; + cursor: pointer; + } + ul.df-resultbox li.df-cheader{ + height: 13px; + overflow: hidden; + padding: 5px 0; + color: #fff; + background: #6ea6d1; + cursor:default; + padding-bottom:10px; + } + ul.df-resultbox li.df-cheader p.df-cheader-title{ + margin: 0 !important; + padding: 0 0 0 10px !important; + float: left; + font-size: 12px; + font-weight: bold; + } + ul.df-resultbox li.df-cheader p.df-cheader-limit{ + margin: 0 !important; + padding: 0 10px 0 0 !important; + float: right; + font-size: 11px; + font-weight: normal; + } + ul.df-resultbox li.df-cdata{ + margin: 0 !important; + padding: 0 !important; + border-bottom: 1px solid #c5c5c5; + } + ul.df-resultbox li.df-cdata:last-child{ + border-bottom: none; + } + ul.df-resultbox li.df-cdata:hover{ + background: #eaf4fd; + } + ul.df-resultbox li.df-cdata a{ + display: block; + padding: 5px 10px; + text-decoration: none !important; + background: #fff; + } + ul.df-resultbox li.df-cdata a:hover{ + background: #cde0ff; + } + ul.df-resultbox li.df-cdata img{ + margin-right: 12px; + } + ul.df-resultbox li.df-cdata p{ + margin: 0 !important; + padding: 0 !important; + color: #444; + font-size: 10px; + min-height:30px; + } + ul.df-resultbox li.df-cdata p span.df-cdata-title{ + display: inline !important; + margin: 0 !important; + padding: 0 !important; + font-size: 11px; + font-weight: bold; + color: #000; + } + ul.df-resultbox li:first-child{ + -moz-border-radius:5px 5px 0 0; + -webkit-border-radius:5px 5px 0 0; + -khtml-border-radius:5px 5px 0 0; + -o-border-radius:5px 5px 0 0; + -ms-border-radius:5px 5px 0 0; + border-radius:5px 5px 0 0; + } + ul.df-resultbox li:last-child{ + -moz-border-radius:0 0 5px 5px; + -webkit-border-radius:0 0 5px 5px; + -khtml-border-radius:0 0 5px 5px; + -o-border-radius:0 0 5px 5px; + -ms-border-radius:0 0 5px 5px; + border-radius:0 0 5px 5px; + } }