diff --git a/public/src/app.js b/public/src/app.js index b84a528764..4a3e3b6ca2 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -445,11 +445,16 @@ var socket, return false; }); - $('#search-form').on('submit', function () { - var input = $(this).find('input'); - ajaxify.go('search/' + input.val().replace(/^[ ?#]*/, '')); - input.val(''); - return false; + $('#search-form').on('submit', function (e) { + e.preventDefault(); + var input = $(this).find('input'), + term = input.val(); + + require(['search'], function(search) { + search.query(term, function() { + input.val(''); + }); + }); }); } diff --git a/public/src/forum/search.js b/public/src/forum/search.js index 38a57eb414..861d8dd441 100644 --- a/public/src/forum/search.js +++ b/public/src/forum/search.js @@ -1,4 +1,4 @@ -define('forum/search', function() { +define('forum/search', ['search'], function(searchModule) { var Search = {}; Search.init = function() { @@ -21,11 +21,13 @@ define('forum/search', function() { $('#search-form input').val(searchQuery); - $('#mobile-search-form').off('submit').on('submit', function() { + $('#mobile-search-form').off('submit').on('submit', function(e) { + e.preventDefault(); var input = $(this).find('input'); - ajaxify.go('search/' + input.val(), null, 'search'); - input.val(''); - return false; + + searchModule.query(input.val(), function() { + input.val(''); + }); }); }; diff --git a/public/src/modules/search.js b/public/src/modules/search.js new file mode 100644 index 0000000000..a110bf4155 --- /dev/null +++ b/public/src/modules/search.js @@ -0,0 +1,54 @@ +define('search', ['navigator'], function(nav) { + "use strict"; + /* globals socket, ajaxify */ + + var Search = {}; + + Search.query = function(term, callback) { + // Detect if a tid was specified + var topicSearch = term.match(/in:topic-([\d]+)/); + + if (!topicSearch) { + term = term.replace(/^[ ?#]*/, ''); + ajaxify.go('search/' + term); + callback(); + } else { + var cleanedTerm = term.replace(topicSearch[0], ''), + tid = topicSearch[1]; + + Search.queryTopic(tid, cleanedTerm, callback); + } + }; + + Search.queryTopic = function(tid, term, callback) { + socket.emit('topics.search', { + tid: tid, + term: term + }, function(err, pids) { + var args = arguments; + + // Sort pids numerically & store + Search.results = pids.sort(function(a, b) { + return a-b; + }); + + if (!err && !ajaxify.currentPage.match(new RegExp('^topic/' + tid))) { + ajaxify.go('topic/' + tid, function() { + if (callback) callback.apply(null, args); + Search.highlightResult(0); + }); + } else { + if (callback) callback.apply(null, args); + Search.highlightResult(0); + } + }); + }; + + Search.highlightResult = function(index) { + socket.emit('posts.getPidIndex', Search.results[index], function(err, postIndex) { + nav.scrollToPost(postIndex-1, true); // why -1? Ask @barisusakli + }); + }; + + return Search; +}); \ No newline at end of file diff --git a/src/topics.js b/src/topics.js index b10709eb47..f5fe901c59 100644 --- a/src/topics.js +++ b/src/topics.js @@ -508,7 +508,7 @@ var async = require('async'), term: term }, callback); } else { - callback(undefined, []); + callback(new Error('no-plugins-available'), []); } };