1*9e94795aSAndroid Build Coastguard Worker(function() { // anonymize 2*9e94795aSAndroid Build Coastguard Worker 3*9e94795aSAndroid Build Coastguard Workervar allTags = {}; 4*9e94795aSAndroid Build Coastguard Workervar loadedResults = []; 5*9e94795aSAndroid Build Coastguard Worker 6*9e94795aSAndroid Build Coastguard Worker/** 7*9e94795aSAndroid Build Coastguard Worker * Initialization code run upon the DOM being ready. 8*9e94795aSAndroid Build Coastguard Worker */ 9*9e94795aSAndroid Build Coastguard Worker$(document).ready(function() { 10*9e94795aSAndroid Build Coastguard Worker // Parse page query parameters. 11*9e94795aSAndroid Build Coastguard Worker var params = parseParams(document.location.search); 12*9e94795aSAndroid Build Coastguard Worker params.tag = params.tag ? makeArray(params.tag) : null; 13*9e94795aSAndroid Build Coastguard Worker 14*9e94795aSAndroid Build Coastguard Worker // Load tag and resource dataset. 15*9e94795aSAndroid Build Coastguard Worker loadTags(); 16*9e94795aSAndroid Build Coastguard Worker loadResources(); 17*9e94795aSAndroid Build Coastguard Worker 18*9e94795aSAndroid Build Coastguard Worker showResults(params); 19*9e94795aSAndroid Build Coastguard Worker 20*9e94795aSAndroid Build Coastguard Worker // Watch for keypresses in the keyword filter textbox, and update 21*9e94795aSAndroid Build Coastguard Worker // search results to reflect the keyword filter. 22*9e94795aSAndroid Build Coastguard Worker $('#resource-browser-keyword-filter').keyup(function() { 23*9e94795aSAndroid Build Coastguard Worker // Filter results on screen by keyword. 24*9e94795aSAndroid Build Coastguard Worker var keywords = $(this).val().split(/\s+/g); 25*9e94795aSAndroid Build Coastguard Worker for (var i = 0; i < loadedResults.length; i++) { 26*9e94795aSAndroid Build Coastguard Worker var hide = false; 27*9e94795aSAndroid Build Coastguard Worker for (var j = 0; j < keywords.length; j++) { 28*9e94795aSAndroid Build Coastguard Worker if (!resultMatchesKeyword(loadedResults[i].result, keywords[j])) { 29*9e94795aSAndroid Build Coastguard Worker hide = true; 30*9e94795aSAndroid Build Coastguard Worker break; 31*9e94795aSAndroid Build Coastguard Worker } 32*9e94795aSAndroid Build Coastguard Worker } 33*9e94795aSAndroid Build Coastguard Worker 34*9e94795aSAndroid Build Coastguard Worker loadedResults[i].node[hide ? 'hide' : 'show'](); 35*9e94795aSAndroid Build Coastguard Worker } 36*9e94795aSAndroid Build Coastguard Worker }); 37*9e94795aSAndroid Build Coastguard Worker}); 38*9e94795aSAndroid Build Coastguard Worker 39*9e94795aSAndroid Build Coastguard Worker/** 40*9e94795aSAndroid Build Coastguard Worker * Returns whether or not the given search result contains the given keyword. 41*9e94795aSAndroid Build Coastguard Worker */ 42*9e94795aSAndroid Build Coastguard Workerfunction resultMatchesKeyword(result, keyword) { 43*9e94795aSAndroid Build Coastguard Worker keyword = keyword.toLowerCase(); 44*9e94795aSAndroid Build Coastguard Worker if (result.title && 45*9e94795aSAndroid Build Coastguard Worker result.title.en.toLowerCase().indexOf(keyword) >= 0) 46*9e94795aSAndroid Build Coastguard Worker return true; 47*9e94795aSAndroid Build Coastguard Worker else if (result.description && 48*9e94795aSAndroid Build Coastguard Worker result.description.en.toLowerCase().indexOf(keyword) >= 0) 49*9e94795aSAndroid Build Coastguard Worker return true; 50*9e94795aSAndroid Build Coastguard Worker else if (result.topicsHtml && 51*9e94795aSAndroid Build Coastguard Worker result.topicsHtml.replace(/\<.*?\>/g,'').toLowerCase().indexOf(keyword) >= 0) 52*9e94795aSAndroid Build Coastguard Worker return true; 53*9e94795aSAndroid Build Coastguard Worker return false; 54*9e94795aSAndroid Build Coastguard Worker} 55*9e94795aSAndroid Build Coastguard Worker 56*9e94795aSAndroid Build Coastguard Worker/** 57*9e94795aSAndroid Build Coastguard Worker * Populates the allTags array with tag data from the ANDROID_TAGS 58*9e94795aSAndroid Build Coastguard Worker * variable in the resource data JS file. 59*9e94795aSAndroid Build Coastguard Worker */ 60*9e94795aSAndroid Build Coastguard Workerfunction loadTags() { 61*9e94795aSAndroid Build Coastguard Worker for (var tagClass in ANDROID_TAGS) { 62*9e94795aSAndroid Build Coastguard Worker for (var tag in ANDROID_TAGS[tagClass]) { 63*9e94795aSAndroid Build Coastguard Worker allTags[tag] = { 64*9e94795aSAndroid Build Coastguard Worker displayTag: ANDROID_TAGS[tagClass][tag], 65*9e94795aSAndroid Build Coastguard Worker tagClass: tagClass 66*9e94795aSAndroid Build Coastguard Worker }; 67*9e94795aSAndroid Build Coastguard Worker } 68*9e94795aSAndroid Build Coastguard Worker } 69*9e94795aSAndroid Build Coastguard Worker} 70*9e94795aSAndroid Build Coastguard Worker 71*9e94795aSAndroid Build Coastguard Worker/** 72*9e94795aSAndroid Build Coastguard Worker * Massage the ANDROID_RESOURCES resource list in the resource data JS file. 73*9e94795aSAndroid Build Coastguard Worker */ 74*9e94795aSAndroid Build Coastguard Workerfunction loadResources() { 75*9e94795aSAndroid Build Coastguard Worker for (var i = 0; i < ANDROID_RESOURCES.length; i++) { 76*9e94795aSAndroid Build Coastguard Worker var resource = ANDROID_RESOURCES[i]; 77*9e94795aSAndroid Build Coastguard Worker 78*9e94795aSAndroid Build Coastguard Worker // Convert the tags array to a tags hash for easier querying. 79*9e94795aSAndroid Build Coastguard Worker resource.tagsHash = {}; 80*9e94795aSAndroid Build Coastguard Worker for (var j = 0; j < resource.tags.length; j++) 81*9e94795aSAndroid Build Coastguard Worker resource.tagsHash[resource.tags[j]] = true; 82*9e94795aSAndroid Build Coastguard Worker 83*9e94795aSAndroid Build Coastguard Worker // Determine the type and topics of the resource by inspecting its tags. 84*9e94795aSAndroid Build Coastguard Worker resource.topics = []; 85*9e94795aSAndroid Build Coastguard Worker for (tag in resource.tagsHash) 86*9e94795aSAndroid Build Coastguard Worker if (tag in allTags) { 87*9e94795aSAndroid Build Coastguard Worker if (allTags[tag].tagClass == 'type') { 88*9e94795aSAndroid Build Coastguard Worker resource.type = tag; 89*9e94795aSAndroid Build Coastguard Worker } else if (allTags[tag].tagClass == 'topic') { 90*9e94795aSAndroid Build Coastguard Worker resource.topics.push(tag); 91*9e94795aSAndroid Build Coastguard Worker } 92*9e94795aSAndroid Build Coastguard Worker } 93*9e94795aSAndroid Build Coastguard Worker 94*9e94795aSAndroid Build Coastguard Worker // Add a humanized topics list string. 95*9e94795aSAndroid Build Coastguard Worker resource.topicsHtml = humanizeList(resource.topics, function(item) { 96*9e94795aSAndroid Build Coastguard Worker return '<strong>' + allTags[item].displayTag + '</strong>'; 97*9e94795aSAndroid Build Coastguard Worker }); 98*9e94795aSAndroid Build Coastguard Worker } 99*9e94795aSAndroid Build Coastguard Worker} 100*9e94795aSAndroid Build Coastguard Worker 101*9e94795aSAndroid Build Coastguard Worker/** 102*9e94795aSAndroid Build Coastguard Worker * Loads resources for the given query parameters. 103*9e94795aSAndroid Build Coastguard Worker */ 104*9e94795aSAndroid Build Coastguard Workerfunction showResults(params) { 105*9e94795aSAndroid Build Coastguard Worker loadedResults = []; 106*9e94795aSAndroid Build Coastguard Worker $('#resource-browser-search-params').empty(); 107*9e94795aSAndroid Build Coastguard Worker $('#resource-browser-results').empty(); 108*9e94795aSAndroid Build Coastguard Worker 109*9e94795aSAndroid Build Coastguard Worker var i, j; 110*9e94795aSAndroid Build Coastguard Worker var searchTags = []; 111*9e94795aSAndroid Build Coastguard Worker if (params.tag) { 112*9e94795aSAndroid Build Coastguard Worker for (i = 0; i < params.tag.length; i++) { 113*9e94795aSAndroid Build Coastguard Worker var tag = params.tag[i]; 114*9e94795aSAndroid Build Coastguard Worker if (tag.toLowerCase() in allTags) { 115*9e94795aSAndroid Build Coastguard Worker searchTags.push(tag.toLowerCase()); 116*9e94795aSAndroid Build Coastguard Worker } 117*9e94795aSAndroid Build Coastguard Worker } 118*9e94795aSAndroid Build Coastguard Worker } 119*9e94795aSAndroid Build Coastguard Worker 120*9e94795aSAndroid Build Coastguard Worker if (searchTags.length) { 121*9e94795aSAndroid Build Coastguard Worker // Show query params. 122*9e94795aSAndroid Build Coastguard Worker var taggedWithHtml = ['Showing technical resources tagged with ']; 123*9e94795aSAndroid Build Coastguard Worker taggedWithHtml.push(humanizeList(searchTags, function(item) { 124*9e94795aSAndroid Build Coastguard Worker return '<strong>' + allTags[item].displayTag + '</strong>'; 125*9e94795aSAndroid Build Coastguard Worker })); 126*9e94795aSAndroid Build Coastguard Worker $('#resource-browser-search-params').html(taggedWithHtml.join('') + ':'); 127*9e94795aSAndroid Build Coastguard Worker } else { 128*9e94795aSAndroid Build Coastguard Worker $('#resource-browser-search-params').html('Showing all technical resources:'); 129*9e94795aSAndroid Build Coastguard Worker } 130*9e94795aSAndroid Build Coastguard Worker 131*9e94795aSAndroid Build Coastguard Worker var results = []; 132*9e94795aSAndroid Build Coastguard Worker 133*9e94795aSAndroid Build Coastguard Worker // Create the list of resources to show. 134*9e94795aSAndroid Build Coastguard Worker for (i = 0; i < ANDROID_RESOURCES.length; i++) { 135*9e94795aSAndroid Build Coastguard Worker var resource = ANDROID_RESOURCES[i]; 136*9e94795aSAndroid Build Coastguard Worker var skip = false; 137*9e94795aSAndroid Build Coastguard Worker 138*9e94795aSAndroid Build Coastguard Worker if (searchTags.length) { 139*9e94795aSAndroid Build Coastguard Worker for (j = 0; j < searchTags.length; j++) 140*9e94795aSAndroid Build Coastguard Worker if (!(searchTags[j] in resource.tagsHash)) { 141*9e94795aSAndroid Build Coastguard Worker skip = true; 142*9e94795aSAndroid Build Coastguard Worker break; 143*9e94795aSAndroid Build Coastguard Worker } 144*9e94795aSAndroid Build Coastguard Worker 145*9e94795aSAndroid Build Coastguard Worker if (skip) 146*9e94795aSAndroid Build Coastguard Worker continue; 147*9e94795aSAndroid Build Coastguard Worker 148*9e94795aSAndroid Build Coastguard Worker results.push(resource); 149*9e94795aSAndroid Build Coastguard Worker continue; 150*9e94795aSAndroid Build Coastguard Worker } 151*9e94795aSAndroid Build Coastguard Worker 152*9e94795aSAndroid Build Coastguard Worker results.push(resource); 153*9e94795aSAndroid Build Coastguard Worker } 154*9e94795aSAndroid Build Coastguard Worker 155*9e94795aSAndroid Build Coastguard Worker // Format and show the list of resource results. 156*9e94795aSAndroid Build Coastguard Worker if (results.length) { 157*9e94795aSAndroid Build Coastguard Worker $('#resource-browser-results .no-results').hide(); 158*9e94795aSAndroid Build Coastguard Worker for (i = 0; i < results.length; i++) { 159*9e94795aSAndroid Build Coastguard Worker var result = results[i]; 160*9e94795aSAndroid Build Coastguard Worker var resultJqNode = $(tmpl('tmpl_resource_browser_result', result)); 161*9e94795aSAndroid Build Coastguard Worker for (tag in result.tagsHash) 162*9e94795aSAndroid Build Coastguard Worker resultJqNode.addClass('tagged-' + tag); 163*9e94795aSAndroid Build Coastguard Worker $('#resource-browser-results').append(resultJqNode); 164*9e94795aSAndroid Build Coastguard Worker 165*9e94795aSAndroid Build Coastguard Worker loadedResults.push({ node: resultJqNode, result: result }); 166*9e94795aSAndroid Build Coastguard Worker } 167*9e94795aSAndroid Build Coastguard Worker } else { 168*9e94795aSAndroid Build Coastguard Worker $('#resource-browser-results .no-results').show(); 169*9e94795aSAndroid Build Coastguard Worker } 170*9e94795aSAndroid Build Coastguard Worker} 171*9e94795aSAndroid Build Coastguard Worker 172*9e94795aSAndroid Build Coastguard Worker/** 173*9e94795aSAndroid Build Coastguard Worker * Formats the given array into a human readable, English string, ala 174*9e94795aSAndroid Build Coastguard Worker * 'a, b and c', with an optional item formatter/wrapper function. 175*9e94795aSAndroid Build Coastguard Worker */ 176*9e94795aSAndroid Build Coastguard Workerfunction humanizeList(arr, itemFormatter) { 177*9e94795aSAndroid Build Coastguard Worker itemFormatter = itemFormatter || function(o){ return o; }; 178*9e94795aSAndroid Build Coastguard Worker arr = arr || []; 179*9e94795aSAndroid Build Coastguard Worker 180*9e94795aSAndroid Build Coastguard Worker var out = []; 181*9e94795aSAndroid Build Coastguard Worker for (var i = 0; i < arr.length; i++) { 182*9e94795aSAndroid Build Coastguard Worker out.push(itemFormatter(arr[i]) + 183*9e94795aSAndroid Build Coastguard Worker ((i < arr.length - 2) ? ', ' : '') + 184*9e94795aSAndroid Build Coastguard Worker ((i == arr.length - 2) ? ' and ' : '')); 185*9e94795aSAndroid Build Coastguard Worker } 186*9e94795aSAndroid Build Coastguard Worker 187*9e94795aSAndroid Build Coastguard Worker return out.join(''); 188*9e94795aSAndroid Build Coastguard Worker} 189*9e94795aSAndroid Build Coastguard Worker 190*9e94795aSAndroid Build Coastguard Worker/** 191*9e94795aSAndroid Build Coastguard Worker * Parses a parameter string, i.e. foo=1&bar=2 into 192*9e94795aSAndroid Build Coastguard Worker * a dictionary object. 193*9e94795aSAndroid Build Coastguard Worker */ 194*9e94795aSAndroid Build Coastguard Workerfunction parseParams(paramStr) { 195*9e94795aSAndroid Build Coastguard Worker var params = {}; 196*9e94795aSAndroid Build Coastguard Worker paramStr = paramStr.replace(/^[?#]/, ''); 197*9e94795aSAndroid Build Coastguard Worker 198*9e94795aSAndroid Build Coastguard Worker var pairs = paramStr.split('&'); 199*9e94795aSAndroid Build Coastguard Worker for (var i = 0; i < pairs.length; i++) { 200*9e94795aSAndroid Build Coastguard Worker var p = pairs[i].split('='); 201*9e94795aSAndroid Build Coastguard Worker var key = p[0] ? decodeURIComponent(p[0]) : p[0]; 202*9e94795aSAndroid Build Coastguard Worker var val = p[1] ? decodeURIComponent(p[1]) : p[1]; 203*9e94795aSAndroid Build Coastguard Worker if (val === '0') 204*9e94795aSAndroid Build Coastguard Worker val = 0; 205*9e94795aSAndroid Build Coastguard Worker if (val === '1') 206*9e94795aSAndroid Build Coastguard Worker val = 1; 207*9e94795aSAndroid Build Coastguard Worker 208*9e94795aSAndroid Build Coastguard Worker if (key in params) { 209*9e94795aSAndroid Build Coastguard Worker // Handle array values. 210*9e94795aSAndroid Build Coastguard Worker params[key] = makeArray(params[key]); 211*9e94795aSAndroid Build Coastguard Worker params[key].push(val); 212*9e94795aSAndroid Build Coastguard Worker } else { 213*9e94795aSAndroid Build Coastguard Worker params[key] = val; 214*9e94795aSAndroid Build Coastguard Worker } 215*9e94795aSAndroid Build Coastguard Worker } 216*9e94795aSAndroid Build Coastguard Worker 217*9e94795aSAndroid Build Coastguard Worker return params; 218*9e94795aSAndroid Build Coastguard Worker} 219*9e94795aSAndroid Build Coastguard Worker 220*9e94795aSAndroid Build Coastguard Worker/** 221*9e94795aSAndroid Build Coastguard Worker * Returns the argument as a single-element array, or the argument itself 222*9e94795aSAndroid Build Coastguard Worker * if it's already an array. 223*9e94795aSAndroid Build Coastguard Worker */ 224*9e94795aSAndroid Build Coastguard Workerfunction makeArray(o) { 225*9e94795aSAndroid Build Coastguard Worker if (!o) 226*9e94795aSAndroid Build Coastguard Worker return []; 227*9e94795aSAndroid Build Coastguard Worker 228*9e94795aSAndroid Build Coastguard Worker if (typeof o === 'object' && 'splice' in o) { 229*9e94795aSAndroid Build Coastguard Worker return o; 230*9e94795aSAndroid Build Coastguard Worker } else { 231*9e94795aSAndroid Build Coastguard Worker return [o]; 232*9e94795aSAndroid Build Coastguard Worker } 233*9e94795aSAndroid Build Coastguard Worker} 234*9e94795aSAndroid Build Coastguard Worker 235*9e94795aSAndroid Build Coastguard Worker})(); 236