-
Notifications
You must be signed in to change notification settings - Fork 49
/
picky.client.js
125 lines (108 loc) · 4.43 KB
/
picky.client.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
var Localization = {};
var PickyI18n = { };
// The client handles parameters and
// offers an insert method.
//
var PickyClient = function(config) {
// The following part handles all of the parameters.
// jQuery selectors are executed.
//
// The locale is by default extracted from the html attribute.
//
// TODO Remove.
//
PickyI18n.locale = $('html').attr('lang').split('-')[0] || 'en';
config['locale'] = config['locale'] || PickyI18n.locale;
// This is used to generate the correct query strings, localized.
//
// e.g with locale it:
// ['title', 'ulysses', 'Ulysses'] => 'titolo:ulysses'
//
// This needs to correspond to the parsing in the search engine.
//
Localization.qualifiers = config.qualifiers || {};
// This is used to explain the preceding word in the suggestion text.
//
// e.g. with locale it:
// ['title', 'ulysses', 'Ulysses'] => 'Ulysses (titolo)'
//
Localization.explanations = config.explanations || {};
// This is used to expain more complex combinations of categories
// in the choices.
//
// e.g. with locale en:{'author,title': '%1$s, who wrote %2$s'}
//
Localization.choices = config.choices || {};
// Delimiters for connecting explanations.
//
Localization.explanation_delimiters = { de:'und', fr:'et', it:'e', en:'and', ch:'und' };
// Either you pass it a backends hash with full and live,
// or you pass it full and live (urls), which will then
// be wrapped in appropriate backends.
//
var backends = config.backends;
if (backends) {
backends.live || alert('Both a full and live backend must be provided.');
backends.full || alert('Both a full and live backend must be provided.');
} else {
config.backends = {
live: new LiveBackend(config),
full: new FullBackend(config)
};
}
// Enclosing selector.
//
var enclosingSelector = config['enclosingSelector'] || '#picky';
// View config.
//
config['input'] = $(config['inputSelector'] || (enclosingSelector + ' input.query'));
config['reset'] = $(config['resetSelector'] || (enclosingSelector + ' div.reset'));
config['button'] = $(config['buttonSelector'] || (enclosingSelector + ' input.search_button'));
config['counter'] = $(config['counterSelector'] || (enclosingSelector + ' div.status'));
config['dashboard'] = $(config['dashboardSelector'] || (enclosingSelector + ' .dashboard'));
config['results'] = $(config['resultsSelector'] || (enclosingSelector + ' div.results'));
config['noResults'] = $(config['noResultsSelector'] || (enclosingSelector + ' .no_results'));
config['moreSelector'] = config['moreSelector'] || enclosingSelector + ' div.results div.addination:last';
// Allocations cloud.
//
config['allocations'] = $(config['allocationsSelector'] || (enclosingSelector + ' .allocations'));
config['shownAllocations'] = config['allocations'].find('.shown');
config['showMoreAllocations'] = config['allocations'].find('.more');
config['hiddenAllocations'] = config['allocations'].find('.hidden');
config['maxSuggestions'] = config['maxSuggestions'] || 3; // How many are shown directly?
// Results rendering.
//
config['results'] = $(config['resultsSelector'] || (enclosingSelector + ' div.results'));
config['resultsDivider'] = config['resultsDivider'] || '';
config['noAsterisks'] = config['noAsterisks'] || []; // e.g. ['category1', 'category2']
config['wrapResults'] = config['wrapResults'] || '<ol class="results"></ol>';
// The central Picky controller.
//
var controller = config.controller && new config.controller(config) || new PickyController(config);
// Insert a query into the client and run it.
// Default is a full query.
//
this.insert = function(query, params, full) {
controller.insert(query, params || {}, full || true);
};
var insert = this.insert;
// Resends the last query text, full/live.
//
// Note: Other variables apart from the text
// could have changed.
//
this.resend = controller.resend;
// Takes a query or nothing as parameter.
//
// And runs a query with it (if $.address exists).
// Can be overridden with a non-empty parameter.
//
this.insertFromURL = function(override) {
if (override && override != '') {
insert(override);
} else {
var lastFullQuery = controller.lastFullQuery();
lastFullQuery && insert(lastFullQuery);
}
};
};