Screencast
Resources
SQLite Databaseautocomplete.php
<?php// capture arguments
$requestTypes = explode(“,”, $_GET[“searchtypes”]);
$query = trim($_REQUEST[‘query’]);// You could set a minimum query string length here
// Set a couple of vars
$query_array = explode(‘ ‘, $query);
$sql = “”;// Address
if (is_numeric($query_array[0]) and in_array(“Address”, $requestTypes)) {
$sql .= “select gid, fulladdress as ‘name’, ‘Address’ as type from address where housenum = :housenum and trim(fulladdress) like :queryright”;
}// Parks
if (in_array(“Parks”, $requestTypes)) {
if (strlen($sql) > 0) $sql .= “ union “;
$sql .= “select gid, prkname as name, ‘Parks’ as type from parks where prkname like :queryboth”;
}// Libraries
if (in_array(“Libraries”, $requestTypes)) {
if (strlen($sql) > 0) $sql .= “ union “;
$sql .= “select gid, library as name, ‘Libraries’ as type from libraries where library like :queryboth”;
}// Order the return
// You could also limit the return size here using the limit keyword
$sql .= “ order by type, name”;try {
// open the database
$db = new PDO(‘sqlite:./acdb.db’);// PDO doesn't like concatenating strings inside bindParam, so we'll do that here for like searches $queryright = $query . "%"; $queryboth = "%" . $query . "%"; // Prepare the SQL statement $statement=$db->prepare($sql); if (strpos($sql, ":housenum")) $statement->bindParam(':housenum', $query_array[0], PDO::PARAM_INT); if (strpos($sql, ":queryright")) $statement->bindParam(':queryright', $queryright, PDO::PARAM_STR); if (strpos($sql, ":queryboth")) $statement->bindParam(':queryboth', $queryboth, PDO::PARAM_STR); // Execute the statement $statement->execute(); $result=$statement->fetchAll(PDO::FETCH_ASSOC); // Return json // You could return jsonp via something like if (isset($_REQUEST['callback'])) $json = $_REQUEST['callback'] . '(' . $json . ')'; $json= json_encode($result); echo $json; // close the database connection $db = NULL;}
catch(PDOException $e) {
print ‘Exception : ‘.$e->getMessage();
}?>
index.html
<!doctype html> <html lang="en"> <head> <title>Ubersearch Example</title> <link type="text/css" media="all" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.21/themes/blitzer/jquery-ui.css" rel="stylesheet" /><style>
* { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; }
#container { margin: 100px auto; width: 500px; text-align: center; }
#searchinput {
font-size: 1.3em;
margin: 0;
padding: 6px 5px;
width: 100%;
}
.ui-autocomplete .ui-menu-item { padding-left: 10px }
.ui-autocomplete-category { font-weight: bold; }
.ui-autocomplete {
overflow: auto;
overflow-y: auto;
overflow-x: hidden;
font-size: 0.9em;
max-height: 400px;
}
.ui-autocomplete-category {
font-weight: bold;
padding: 0 4px;
line-height: 1.5;
font-variant: small-caps;
font-size: 1.1em;
}
</style></head>
<body>
<div id=”container”>
<input id=”searchinput” class=”ui-corner-all” x-webkit-speech speech placeholder=”Start here!” />
</div><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.21/jquery-ui.min.js"></script> <script src="script.js"></script></body>
</html>
script.js
$(document).ready(function(){
// Select text box content on click
$("#searchinput").click(function() { $(this).select(); });
// jQuery UI Autocomplete
$("#searchinput").autocomplete({
minLength: 4,
delay: 400,
autoFocus: true,
source: function(request, response) {
$.ajax({
url: "autocomplete.php",
dataType: "json",
data: {
searchtypes: "Address,Libraries,Parks",
query: request.term
},
success: function(data) {
if (data.length > 0) {
response($.map(data, function(item) {
return {
label: item.name.toProperCase(),
gid: item.gid,
responsetype: item.type
};
}));
} else { // No records found message
response($.map([{}], function(item) {
return {
responsetype: "I've got nothing",
label: "Well...darn."
};
}));
}
}
});
},
select: function(event, ui) {
if (ui.item.gid) {
locationFinder(ui.item.responsetype, ui.item.gid);
}
}
}).data("autocomplete")._renderMenu = function(ul, items) {
var self = this,
currentCategory = "";
$.each(items, function(index, item) {
if (item.responsetype != currentCategory && item.responsetype !== undefined) {
ul.append("<li class='ui-autocomplete-category'>" + item.responsetype + "</li>");
currentCategory = item.responsetype;
}
self._renderItem(ul, item);
});
};
});
function locationFinder( type , gid ) {
console.log("I'm off to map " + type + " with an id of " + gid + "!");
}
String.prototype.toProperCase = function () {
return this.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
};